NMC Overall
The Composite Index of National Capability (CINC) is a statistical measure of national. It uses an average of percentages of world totals in six different components.The components represent demographic, economic, and military strength.
TPR = total population of country ratio
UPR = urban population of country ratio
ISPR = iron and steel production of country ratio
ECR = primary energy consumption ratio
MER = military expenditure ratio
MPR = military personnel ratio
Current World Powers
countries <- c("United States of America", "United Kingdom", "France", "Russia","Germany", "Italy", "Japan", "China")
country_code <- member_alliances$ccode[match(countries, member_alliances$state_name)]
nmc_c <- c("")
for(code in country_code){
nmc_c <- rbind(nmc_c, NMC[NMC$ccode == as.numeric(code),])
}
invalid factor level, NA generated
nmc_c <- nmc_c[c(2:nrow(nmc_c)),]
nmc_c$irst <- as.numeric(nmc_c$irst)
nmc_c$milex <- as.numeric(nmc_c$milex)
nmc_c$milper <- as.numeric(nmc_c$milper)
nmc_c$pec <- as.numeric(nmc_c$pec)
nmc_c$tpop <- as.numeric(nmc_c$tpop)
nmc_c$upop <- as.numeric(nmc_c$upop)
nmc_c$cinc <- as.numeric(nmc_c$cinc)
nmc_c$year <- as.numeric(nmc_c$year)
## create individual plots of the 6 factors in CINC
irst <- ggplot(nmc_c[nmc_c$year > 1930,], aes(year , irst, color = stateabb, group = stateabb)) + geom_point(alpha = 1/100) + geom_line() + theme(axis.text.x = element_text(angle = 90, hjust = 1), plot.title = element_text(hjust = 0.5)) + ggtitle("Iron and Steel Production")
ex <- ggplot(nmc_c[nmc_c$year > 1930,], aes(year , milex, color = stateabb, group = stateabb)) + geom_point(alpha = 1/100) + geom_line() + theme(axis.text.x = element_text(angle = 90, hjust = 1), plot.title = element_text(hjust = 0.5)) + ggtitle("Military Expenditures")
per <- ggplot(nmc_c[nmc_c$year > 1930,], aes(year , milper, color = stateabb, group = stateabb)) + geom_point(alpha = 1/100) + geom_line() + theme(axis.text.x = element_text(angle = 90, hjust = 1), plot.title = element_text(hjust = 0.5)) + ggtitle("Military Personell")
pec <- ggplot(nmc_c[nmc_c$year > 1930,], aes(year , pec, color = stateabb, group = stateabb)) + geom_point(alpha = 1/100) + geom_line() + theme(axis.text.x = element_text(angle = 90, hjust = 1), plot.title = element_text(hjust = 0.5)) + ggtitle("Primary Energy Consumption Ratio")
tpop <- ggplot(nmc_c[nmc_c$year > 1930,], aes(year , tpop, color = stateabb, group = stateabb)) + geom_point(alpha = 1/100) + geom_line() + theme(axis.text.x = element_text(angle = 90, hjust = 1), plot.title = element_text(hjust = 0.5)) + ggtitle("Total Population")
upop <- ggplot(nmc_c[nmc_c$year > 1930,], aes(year , upop, color = stateabb, group = stateabb)) + geom_point(alpha = 1/100) + geom_line() + theme(axis.text.x = element_text(angle = 90, hjust = 1), plot.title = element_text(hjust = 0.5)) + ggtitle("Urban Population")
grid.arrange(irst, ex, per, pec, tpop, upop , nrow = 3)

## create plots of CINC and mark the different conflicts we are looking at
d=data.frame(x1=c(1914,1939, 1947, 1950, 1955, 2001), x2=c(1918, 1945, 1991, 1953, 1975, 2010), y1=c(0,0,0,0,0,0), y2=c(.4,.4,.4,.4,.4,.4), Conflict=c("WWI", "WWII", "Cold War", "Korean War", "Vietnam War", "Afghanistan War"), r=c(1,2,3,4,5,6))
nmc_yr<- nmc_c[nmc_c$year > 1900,]
ggplot() +
scale_x_continuous(name="x") +
scale_y_continuous(name="y") +
geom_rect(data=d, mapping=aes(xmin=x1, xmax=x2, ymin=y1, ymax=max(nmc_yr$pec), fill=Conflict),alpha=0.15) +
geom_rect(data = d, mapping = aes(xmin=1932, xmax=1939, ymin=0, ymax=max(nmc_yr$pec)), alpha = 1, color = "red")+
geom_rect(data = d, mapping = aes(xmin=1941, xmax=1941, ymin=0, ymax=max(nmc_yr$pec)), alpha =1, color = "blue") +
geom_line(data = nmc_yr, aes(x = year, y = pec, color = stateabb, group = stateabb))

## Heatmap of CNIC
ggplot(nmc_c[nmc_c$year > 1900,], aes(stateabb, year, fill = cinc)) + geom_tile()+
scale_fill_viridis() + ggtitle("Heatmap of cinc") + theme(axis.text.x = element_text(angle = 60, hjust = 1),plot.title = element_text(hjust = 0.5))

##PCP PLot
library(GGally)
Attaching package: ‘GGally’
The following object is masked from ‘package:dplyr’:
nasa
ct <- ggparcoord(nmc_c[nmc_c$year>1930,], columns = 4:10, scale = "uniminmax", alphaLines = .2, groupColumn = "stateabb")
yr <- ggparcoord(nmc_c[nmc_c$year>1930,], columns = 4:10, scale = "uniminmax", alphaLines = .2, groupColumn = "year")
grid.arrange(ct, yr, nrow = 2)

World War I
In the aftermath of the war, four empires disappeared: the German, Austro-Hungarian, Ottoman, and Russian. Numerous nations regained their former independence, and new ones were created.Four dynasties, together with their ancillary aristocracies, all fell as a result of the war: the Romanovs, the Hohenzollerns, the Habsburgs, and the Ottomans. Belgium and Serbia were badly damaged, as was France, with 1.4 million soldiers dead,[183] not counting other casualties. Germany and Russia were similarly affected
allied <- c("United States of America", "United Kingdom", "Russia", "Japan", "Italy")
allied_ccode <- member_alliances$ccode[match(allied, member_alliances$state_name)]
central <- c("Germany", "Turkey", "Austria-Hungary", "Romania", "Bulgaria")
central_ccode <- member_alliances$ccode[match(central, member_alliances$state_name)]
WWI_yrMax = 1928
WWI_yrMin = 1904
WWI <- NMC
alliedP_nmc <- c("")
for(code in allied_ccode){
alliedP_nmc <- rbind(alliedP_nmc, WWI[WWI$ccode == as.numeric(code),])
}
invalid factor level, NA generated
alliedP_nmc <- alliedP_nmc [c(2:nrow(alliedP_nmc )),]
alliedP_nmc$side = "Allied Powers"
centralP_nmc <- c("")
for(code in central_ccode){
centralP_nmc <- rbind(centralP_nmc, NMC[NMC$ccode == as.numeric(code),])
}
invalid factor level, NA generated
centralP_nmc <- centralP_nmc[c(2:nrow(centralP_nmc)),]
centralP_nmc$side = "Central Powers"
WWI <-rbind(alliedP_nmc,centralP_nmc)
WWI$milex <- as.numeric(WWI$milex)
WWI$milper <- as.numeric(WWI$milper)
WWI$pec <- as.numeric(WWI$pec)
WWI$tpop <- as.numeric(WWI$tpop)
WWI$upop <- as.numeric(WWI$upop)
WWI$cinc <- as.numeric(WWI$cinc)
WWI$year <- as.numeric(WWI$year)
WWI$irst <- as.numeric(WWI$irst)
WWI <- WWI[WWI$year >= WWI_yrMin, ]
WWI <- WWI[WWI$year <= WWI_yrMax, ]
d=data.frame(x1=c(1939), x2=c(1918, 1945, 1991, 1953, 1975, 2010), y1=c(0,0,0,0,0,0), y2=c(.4,.4,.4,.4,.4,.4), Conflict=c("WWI", "WWII", "Cold War", "Korean War", "Vietnam War", "Afghanistan War"), r=c(1,2,3,4,5,6))
ggplot() +
geom_rect(data=d, mapping=aes(xmin=1914, xmax=1918, ymin=0, ymax=.4),alpha=0.1, fill = "salmon") +
geom_line(data = WWI, aes(x = year, y = cinc, color = stateabb, group = stateabb)) + facet_wrap(~side)

ggplot() +
geom_rect(data=d, mapping=aes(xmin=1914, xmax=1918, ymin=0, ymax=max(WWI$irst)),alpha=0.1, fill = "salmon") +
geom_line(data = WWI, aes(x = year, y = irst, color = stateabb, group = stateabb)) + facet_wrap(~side)

ggplot() +
geom_rect(data=d, mapping=aes(xmin=1914, xmax=1918, ymin=0, ymax= max(WWI$milex)),alpha=0.1, fill = "salmon") +
geom_line(data = WWI, aes(x = year, y = milex, color = stateabb, group = stateabb)) + facet_wrap(~side)

ggplot() +
geom_rect(data=d, mapping=aes(xmin=1914, xmax=1918, ymin=0, ymax= max(WWI$milex)),alpha=0.1, fill = "salmon") +
geom_line(data = WWI, aes(x = year, y = milex, color = stateabb, group = stateabb)) + facet_wrap(~side)

ggplot() +
geom_rect(data=d, mapping=aes(xmin=1914, xmax=1918, ymin=0, ymax=max(WWI$milper)),alpha=0.1, fill = "salmon") +
geom_line(data = WWI, aes(x = year, y = milper, color = stateabb, group = stateabb)) + facet_wrap(~side)

ggplot() +
geom_rect(data=d, mapping=aes(xmin=1914, xmax=1918, ymin=0, ymax=max(WWI$pec)),alpha=0.1, fill = "salmon") +
geom_line(data = WWI, aes(x = year, y = pec, color = stateabb, group = stateabb)) + facet_wrap(~side)

ggplot() +
geom_rect(data=d, mapping=aes(xmin=1914, xmax=1918, ymin=0, ymax=max(WWI$tpop)),alpha=0.1, fill = "salmon") +
geom_line(data = WWI, aes(x = year, y = tpop, color = stateabb, group = stateabb)) + facet_wrap(~side)

ggplot() +
geom_rect(data=d, mapping=aes(xmin=1914, xmax=1918, ymin=0, ymax=max(WWI$upop)),alpha=0.1, fill = "salmon") +
geom_line(data = WWI, aes(x = year, y = upop, color = stateabb, group = stateabb)) + facet_wrap(~side)

World War II (1939-1945)
allies <- c("United States of America", "United Kingdom", "France", "Russia", "Australia", "Belgium", "Brazil", "Canada", "China", "Denmark", "Greece", "Netherlands", "New Zealand", "Norway", "Poland", "South Africa", "Yugoslavia")
allies_ccode <- member_alliances$ccode[match(allies, member_alliances$state_name)]
axis <- c("Germany", "Italy", "Japan", "Hungary", "Romania", "Bulgaria")
axis_ccode <- member_alliances$ccode[match(axis, member_alliances$state_name)]
## US, GB,JAP, Germn, France, Italy, Russia
WWII_year_st = 1939
WWII_year_end = 1945
allies_nmc <- c("")
for(code in allies_ccode){
allies_nmc <- rbind(allies_nmc, NMC[NMC$ccode == as.numeric(code),])
}
invalid factor level, NA generated
allies_nmc <- allies_nmc [c(2:nrow(allies_nmc )),]
allies_nmc$side = "Allied Powers"
axis_nmc <- c("")
for(code in axis_ccode){
axis_nmc <- rbind(axis_nmc, NMC[NMC$ccode == as.numeric(code),])
}
invalid factor level, NA generated
axis_nmc <- axis_nmc[c(2:nrow(axis_nmc)),]
axis_nmc$side = "Axis Powers"
WWII <-rbind(allies_nmc,axis_nmc)
WWII$irst <- as.numeric(WWII$irst)
WWII$milex <- as.numeric(WWII$milex)
WWII$milper <- as.numeric(WWII$milper)
WWII$pec <- as.numeric(WWII$pec)
WWII$tpop <- as.numeric(WWII$tpop)
WWII$upop <- as.numeric(WWII$upop)
WWII$cinc <- as.numeric(WWII$cinc)
WWII$year <- as.numeric(WWII$year)
WWII <- WWII[WWII$year < 1950,]
WWII <- WWII[WWII$year > 1934,]
## create plots of CINC and mark the different conflicts we are looking at year
d=data.frame(x1=c(1939), x2=c(1918, 1945, 1991, 1953, 1975, 2010), y1=c(0,0,0,0,0,0), y2=c(.4,.4,.4,.4,.4,.4), Conflict=c("WWI", "WWII", "Cold War", "Korean War", "Vietnam War", "Afghanistan War"), r=c(1,2,3,4,5,6))
ggplot() +
scale_x_continuous(name="x") +
scale_y_continuous(name="y") +
geom_rect(data=d, mapping=aes(xmin=1939, xmax=1945, ymin=0, ymax=.4),alpha=0.1, fill = "salmon") +
geom_line(data = WWII, aes(x = year, y = cinc, color = stateabb, group = stateabb)) + facet_wrap(~side)

irst<- ggplot() +
geom_rect(data=d, mapping=aes(xmin=WWII_year_st, xmax=WWII_year_end, ymin=0, ymax=max(WWII$irst)),alpha=0.1, fill = "salmon") +
geom_line(data = WWII, aes(x = year, y = irst, color = stateabb, group = stateabb)) + facet_wrap(~side)
ex<-ggplot() +
geom_rect(data=d, mapping=aes(xmin=WWII_year_st, xmax=WWII_year_end, ymin=0, ymax=max(WWII$milex)),alpha=0.1, fill = "salmon") +
geom_line(data = WWII, aes(x = year, y = milex, color = stateabb, group = stateabb)) + facet_wrap(~side)
per<-ggplot() +
geom_rect(data=d, mapping=aes(xmin=WWII_year_st, xmax=WWII_year_end, ymin=0, ymax=max(WWII$milper)),alpha=0.1, fill = "salmon") +
geom_line(data = WWII, aes(x = year, y = milper, color = stateabb, group = stateabb)) + facet_wrap(~side)
pec<-ggplot() +
geom_rect(data=d, mapping=aes(xmin=WWII_year_st, xmax=WWII_year_end, ymin=0, ymax=max(WWII$pec)),alpha=0.1, fill = "salmon") +
geom_line(data = WWII, aes(x = year, y = pec, color = stateabb, group = stateabb)) + facet_wrap(~side)
upop<-ggplot() +
geom_rect(data=d, mapping=aes(xmin=WWII_year_st, xmax=WWII_year_end, ymin=0, ymax=max(WWII$upop)),alpha=0.1, fill = "salmon") +
geom_line(data = WWII, aes(x = year, y = upop, color = stateabb, group = stateabb)) + facet_wrap(~side)
tpop<-ggplot() +
geom_rect(data=d, mapping=aes(xmin=WWII_year_st, xmax=WWII_year_end, ymin=0, ymax=max(WWII$tpop)),alpha=0.1, fill = "salmon") +
geom_line(data = WWII, aes(x = year, y = tpop, color = stateabb, group = stateabb)) + facet_wrap(~side)
grid.arrange(irst, ex, per, pec, tpop, upop , nrow = 3)

Cold War (1947-1991)
Cold War Wikipedia
The Cold War was a state of geopolitical tension after World War II between powers in the Eastern Bloc (the Soviet Union and its satellite states) and powers in the Western Bloc (the United States, its NATO allies and others). Historians do not fully agree on the dates, but a common timeframe is the period between 1947, the year the Truman Doctrine (a U.S. foreign policy pledging to aid nations threatened by Soviet expansionism) was announced, and 1991, the year the Soviet Union collapsed.
The term “cold” is used because there was no large-scale fighting directly between the two sides, although there were major regional wars, known as proxy wars, supported by the two sides. The Cold War split the temporary wartime alliance against Nazi Germany, leaving the Soviet Union and the United States as two superpowers with profound economic and political differences.
After the dissolution of the Soviet Union, Russia drastically cut military spending, and restructuring the economy left millions unemployed.[281] The capitalist reforms culminated in a recession in the early 1990s more severe than the Great Depression as experienced by the United States and Germany.[282]
The Cold War continues to influence world affairs. The post-Cold War world is considered to be unipolar, with the United States the sole remaining superpower.The Cold War defined the political role of the United States after World War II—by 1989 the United States had military alliances with 50 countries, with 526,000 troops stationed abroad,[286] with 326,000 in Europe (two-thirds of which in west Germany)[287] and 130,000 in Asia (mainly Japan and South Korea).[286] The Cold War also marked the zenith of peacetime military–industrial complexes, especially in the United States, and large-scale military funding of science.[288] These complexes, though their origins may be found as early as the 19th century, snowballed considerably during the Cold War.[289]
NATO <- c("United States of America", "United Kingdom", "Belgium", "Netherlands", "France","Canada", "Portugal", "Italy", "Norway", "Denmark", "Icealnd", "Turkey", "Greece")
nato_ccode <- member_alliances$ccode[match(NATO, member_alliances$state_name)]
warsaw <- c("Russia", "Czechoslovakia", "Romania", "Bulgaria", "Poland", "Hungary")
warsaw_ccode <- member_alliances$ccode[match(warsaw, member_alliances$state_name)]
cw_year_st = 1991
cw_year_end = 1947
cw <- NMC
nato_nmc <- c("")
for(code in nato_ccode ){
nato_nmc <- rbind(nato_nmc, cw[cw$ccode == as.numeric(code),])
}
invalid factor level, NA generated
nato_nmc <- nato_nmc [c(2:nrow(nato_nmc )),]
nato_nmc$side = "US and Allies "
warsaw_nmc <- c("")
for(code in warsaw_ccode ){
warsaw_nmc <- rbind(warsaw_nmc, cw[cw$ccode == as.numeric(code),])
}
invalid factor level, NA generated
warsaw_nmc <- warsaw_nmc[c(2:nrow(warsaw_nmc)),]
warsaw_nmc$side = "USSR and Allies"
cw <-rbind(nato_nmc,warsaw_nmc)
cw$milex <- as.numeric(cw$milex)
cw$milper <- as.numeric(cw$milper)
cw$pec <- as.numeric(cw$pec)
cw$tpop <- as.numeric(cw$tpop)
cw$upop <- as.numeric(cw$upop)
cw$cinc <- as.numeric(cw$cinc)
cw$year <- as.numeric(cw$year)
cw$irst <- as.numeric(cw$irst)
cw <- cw[cw$year >= cw_year_st-10, ]
ggplot() +
geom_rect(data=d, mapping=aes(xmin=cw_year_st, xmax=cw_year_end, ymin=0, ymax=.4),alpha=0.1, fill = "salmon") +
geom_line(data = cw, aes(x = year, y = cinc, color = stateabb, group = stateabb)) + facet_wrap(~side)

irst<- ggplot() +
geom_rect(data=d, mapping=aes(xmin=cw_year_st, xmax=cw_year_end, ymin=0, ymax=max(cw$irst)),alpha=0.1, fill = "salmon") +
geom_line(data = cw, aes(x = year, y = irst, color = stateabb, group = stateabb)) + facet_wrap(~side)
ex<-ggplot() +
geom_rect(data=d, mapping=aes(xmin=cw_year_st, xmax=cw_year_end, ymin=0, ymax=max(cw$milex)),alpha=0.1, fill = "salmon") +
geom_line(data = cw, aes(x = year, y = milex, color = stateabb, group = stateabb)) + facet_wrap(~side)
per<-ggplot() +
geom_rect(data=d, mapping=aes(xmin=cw_year_st, xmax=cw_year_end, ymin=0, ymax=max(cw$milper)),alpha=0.1, fill = "salmon") +
geom_line(data = cw, aes(x = year, y = milper, color = stateabb, group = stateabb)) + facet_wrap(~side)
pec<-ggplot() +
geom_rect(data=d, mapping=aes(xmin=cw_year_st, xmax=cw_year_end, ymin=0, ymax=max(cw$pec)),alpha=0.1, fill = "salmon") +
geom_line(data = cw, aes(x = year, y = pec, color = stateabb, group = stateabb)) + facet_wrap(~side)
upop<-ggplot() +
geom_rect(data=d, mapping=aes(xmin=cw_year_st, xmax=cw_year_end, ymin=0, ymax=max(cw$upop)),alpha=0.1, fill = "salmon") +
geom_line(data = cw, aes(x = year, y = upop, color = stateabb, group = stateabb)) + facet_wrap(~side)
tpop<-ggplot() +
geom_rect(data=d, mapping=aes(xmin=cw_year_st, xmax=cw_year_end, ymin=0, ymax=max(cw$tpop)),alpha=0.1, fill = "salmon") +
geom_line(data = cw, aes(x = year, y = tpop, color = stateabb, group = stateabb)) + facet_wrap(~side)
grid.arrange(irst, ex, per, pec, tpop, upop , nrow = 3)

Korean War (1950-1953)
One of the more significant impacts of containment was the outbreak of the Korean War. In June 1950, Kim Il-sung’s North Korean People’s Army invaded South Korea.[99] Joseph Stalin “planned, prepared, and initiated” the invasion,[100] creating “detailed [war] plans” that were communicated to the North Koreans.To Stalin’s surprise,[14] the UN Security Council backed the defense of South Korea, though the Soviets were then boycotting meetings in protest that Taiwan and not Communist China held a permanent seat on the Council.[105] A UN force of personnel from South Korea, the United States, the United Kingdom, Turkey, Canada, Colombia, Australia, France, South Africa, the Philippines, the Netherlands, Belgium, New Zealand and other countries joined to stop the invasion.[106]
General Douglas MacArthur, UN Command CiC (seated), observes the naval shelling of Incheon from the USS Mt. McKinley, September 15, 1950. Among other effects, the Korean War galvanised NATO to develop a military structure.[107] Public opinion in countries involved, such as Great Britain, was divided for and against the war. Many feared an escalation into a general war with Communist China, and even nuclear war. The strong opposition to the war often strained Anglo-American relations. For these reasons British officials sought a speedy end to the conflict, hoping to unite Korea under United Nations auspices and withdrawal of all foreign forces.[108]
Even though the Chinese and North Koreans were exhausted by the war and were prepared to end it by late 1952, Stalin insisted that they continue fighting, and the Armistice was approved only in July 1953, after Stalin’s death.[30] North Korean leader Kim Il Sung created a highly centralized, totalitarian dictatorship – which continues to date – according himself unlimited power and generating a formidable cult of personality.[109][110] In the South, the American-backed strongman Syngman Rhee ran a significantly less brutal but deeply corrupt and authoritarian regime.[111] After Rhee was overthrown in 1960, South Korea fell within a year under a period of military rule that lasted until the re-establishment of a multi-party system in the late 1980s.
sk <- c("United States of America", "United Kingdom", "South Korea")
sk_ccode <- member_alliances$ccode[match(sk, member_alliances$state_name)]
nk <- c("Russia", "North Korea", "China")
nk_ccode <- member_alliances$ccode[match(nk, member_alliances$state_name)]
kw_year_st = 1950
kw_year_end = 1953
kw <- NMC
sk_nmc <- c("")
for(code in sk_ccode ){
sk_nmc <- rbind(sk_nmc, kw[kw$ccode == as.numeric(code),])
}
invalid factor level, NA generated
sk_nmc <- sk_nmc [c(2:nrow(sk_nmc )),]
sk_nmc$side = "US and Allies "
nk_nmc <- c("")
for(code in nk_ccode ){
nk_nmc <- rbind(nk_nmc, kw[kw$ccode == as.numeric(code),])
}
invalid factor level, NA generated
nk_nmc <- nk_nmc[c(2:nrow(nk_nmc)),]
nk_nmc$side = "USSR and Allies"
kw <-rbind(sk_nmc,nk_nmc)
kw$milex <- as.numeric(kw$milex)
kw$milper <- as.numeric(kw$milper)
kw$pec <- as.numeric(kw$pec)
kw$tpop <- as.numeric(kw$tpop)
kw$upop <- as.numeric(kw$upop)
kw$cinc <- as.numeric(kw$cinc)
kw$year <- as.numeric(kw$year)
kw$irst <- as.numeric(kw$irst)
kw <- kw[kw$year >= kw_year_st-5, ]
kw <- kw[kw$year < kw_year_end+5, ]
ggplot() +
geom_rect(data=d, mapping=aes(xmin=kw_year_st, xmax=kw_year_end, ymin=0, ymax=.4),alpha=0.1, fill = "salmon") +
geom_line(data = kw, aes(x = year, y = cinc, color = stateabb, group = stateabb)) + facet_wrap(~side)

irst<- ggplot() +
geom_rect(data=d, mapping=aes(xmin=kw_year_st, xmax=kw_year_end, ymin=0, ymax=max(kw$irst)),alpha=0.1, fill = "salmon") +
geom_line(data = kw, aes(x = year, y = irst, color = stateabb, group = stateabb)) + facet_wrap(~side)
ex<-ggplot() +
geom_rect(data=d, mapping=aes(xmin=kw_year_st, xmax=kw_year_end, ymin=0, ymax=max(kw$milex)),alpha=0.1, fill = "salmon") +
geom_line(data = kw, aes(x = year, y = milex, color = stateabb, group = stateabb)) + facet_wrap(~side)
per<-ggplot() +
geom_rect(data=d, mapping=aes(xmin=kw_year_st, xmax=kw_year_end, ymin=0, ymax=max(kw$milper)),alpha=0.1, fill = "salmon") +
geom_line(data = kw, aes(x = year, y = milper, color = stateabb, group = stateabb)) + facet_wrap(~side)
pec<-ggplot() +
geom_rect(data=d, mapping=aes(xmin=kw_year_st, xmax=kw_year_end, ymin=0, ymax=max(kw$pec)),alpha=0.1, fill = "salmon") +
geom_line(data = kw, aes(x = year, y = pec, color = stateabb, group = stateabb)) + facet_wrap(~side)
upop<-ggplot() +
geom_rect(data=d, mapping=aes(xmin=kw_year_st, xmax=kw_year_end, ymin=0, ymax=max(kw$upop)),alpha=0.1, fill = "salmon") +
geom_line(data = kw, aes(x = year, y = upop, color = stateabb, group = stateabb)) + facet_wrap(~side)
tpop<-ggplot() +
geom_rect(data=d, mapping=aes(xmin=kw_year_st, xmax=kw_year_end, ymin=0, ymax=max(kw$tpop)),alpha=0.1, fill = "salmon") +
geom_line(data = kw, aes(x = year, y = tpop, color = stateabb, group = stateabb)) + facet_wrap(~side)
grid.arrange(irst, ex, per, pec, tpop, upop , nrow = 3)

Vietnam War (1955-1975)
us <- c("United States of America", "South Korea", "China", "New Zealand", "Australia")
us_ccode <- member_alliances$ccode[match(us, member_alliances$state_name)]
viet <- c("Russia", "North Korea", "Vietnam", "Cuba")
viet_ccode <- member_alliances$ccode[match(viet, member_alliances$state_name)]
vw_year_st = 1955
vw_year_end = 1975
vw <- NMC
us_nmc <- c("")
for(code in us_ccode ){
us_nmc <- rbind(us_nmc, vw[vw$ccode == as.numeric(code),])
}
invalid factor level, NA generated
us_nmc <- us_nmc [c(2:nrow(us_nmc )),]
us_nmc$side = "US and Allies "
viet_nmc <- c("")
for(code in viet_ccode ){
viet_nmc <- rbind(viet_nmc, vw[vw$ccode == as.numeric(code),])
}
invalid factor level, NA generated
viet_nmc <- viet_nmc[c(2:nrow(viet_nmc)),]
viet_nmc$side = "Vietnam and Allies"
vw <-rbind(us_nmc,viet_nmc)
vw$milex <- as.numeric(vw$milex)
vw$milper <- as.numeric(vw$milper)
vw$pec <- as.numeric(vw$pec)
vw$tpop <- as.numeric(vw$tpop)
vw$upop <- as.numeric(vw$upop)
vw$cinc <- as.numeric(vw$cinc)
vw$year <- as.numeric(vw$year)
vw$irst <- as.numeric(vw$irst)
vw <- vw[vw$year >= vw_year_st-5, ]
vw <- vw[vw$year < vw_year_end+5, ]
ggplot() +
geom_rect(data=d, mapping=aes(xmin=vw_year_st, xmax=vw_year_end, ymin=0, ymax=.4),alpha=0.1, fill = "salmon") +
geom_line(data = vw, aes(x = year, y = cinc, color = stateabb, group = stateabb)) + facet_wrap(~side)

irst<- ggplot() +
geom_rect(data=d, mapping=aes(xmin=vw_year_st, xmax=vw_year_end, ymin=0, ymax=max(vw$irst)),alpha=0.1, fill = "salmon") +
geom_line(data = vw, aes(x = year, y = irst, color = stateabb, group = stateabb)) + facet_wrap(~side)
ex<-ggplot() +
geom_rect(data=d, mapping=aes(xmin=vw_year_st, xmax=vw_year_end, ymin=0, ymax=max(vw$milex)),alpha=0.1, fill = "salmon") +
geom_line(data = vw, aes(x = year, y = milex, color = stateabb, group = stateabb)) + facet_wrap(~side)
per<-ggplot() +
geom_rect(data=d, mapping=aes(xmin=vw_year_st, xmax=vw_year_end, ymin=0, ymax=max(vw$milper)),alpha=0.1, fill = "salmon") +
geom_line(data = vw, aes(x = year, y = milper, color = stateabb, group = stateabb)) + facet_wrap(~side)
pec<-ggplot() +
geom_rect(data=d, mapping=aes(xmin=vw_year_st, xmax=vw_year_end, ymin=0, ymax=max(vw$pec)),alpha=0.1, fill = "salmon") +
geom_line(data = vw, aes(x = year, y = pec, color = stateabb, group = stateabb)) + facet_wrap(~side)
upop<-ggplot() +
geom_rect(data=d, mapping=aes(xmin=vw_year_st, xmax=vw_year_end, ymin=0, ymax=max(vw$upop)),alpha=0.1, fill = "salmon") +
geom_line(data = vw, aes(x = year, y = upop, color = stateabb, group = stateabb)) + facet_wrap(~side)
tpop<-ggplot() +
geom_rect(data=d, mapping=aes(xmin=vw_year_st, xmax=vw_year_end, ymin=0, ymax=max(vw$tpop)),alpha=0.1, fill = "salmon") +
geom_line(data = vw, aes(x = year, y = tpop, color = stateabb, group = stateabb)) + facet_wrap(~side)
grid.arrange(irst, ex, per, pec, tpop, upop , nrow = 3)

War in Afghanistan (2001-2010)
The war in Afghanistan (or the American war in Afghanistan) followed the 2001 United States invasion of Afghanistan.Supported initially by the United Kingdom, the US was later joined by the rest of NATO, beginning in 2003. Its public aims were to dismantle al-Qaeda and to deny it a safe base of operations in Afghanistan by removing the Taliban from power.[32] Key allies, including the United Kingdom, supported the U.S. from the start to the end of the phase. This phase of the war is the longest war in United States history.
Result:
- Destruction of al-Qaeda and Taliban militant training camps
- Fall of the Taliban government
- Establishment of the Islamic Republic of Afghanistan under the Karzai administration
- Start of Taliban insurgency
- Death of Osama bin Laden
- Commencement of war’s 2015–present phase
us <- c("United States of America", "United Kingdom", "Canada", "Germany", "Australia")
us_ccode <- member_alliances$ccode[match(us, member_alliances$state_name)]
afg <- c("Afghanistan")
afg_ccode <- member_alliances$ccode[match(afg, member_alliances$state_name)]
aw_year_st = 2001
aw_year_end = 2010
aw <- NMC
us_nmc <- c("")
for(code in us_ccode ){
us_nmc <- rbind(us_nmc, aw[aw$ccode == as.numeric(code),])
}
invalid factor level, NA generated
us_nmc <- us_nmc [c(2:nrow(us_nmc )),]
us_nmc$side = "US and UN"
afg_nmc <- c("")
for(code in afg_ccode ){
afg_nmc <- rbind(afg_nmc, aw[aw$ccode == as.numeric(code),])
}
invalid factor level, NA generated
afg_nmc <- afg_nmc[c(2:nrow(afg_nmc)),]
afg_nmc$side = "Afghanistan"
aw <-rbind(us_nmc,afg_nmc)
aw$milex <- as.numeric(aw$milex)
aw$milper <- as.numeric(aw$milper)
aw$pec <- as.numeric(aw$pec)
aw$tpop <- as.numeric(aw$tpop)
aw$upop <- as.numeric(aw$upop)
aw$cinc <- as.numeric(aw$cinc)
aw$year <- as.numeric(aw$year)
aw$irst <- as.numeric(aw$irst)
aw <- aw[aw$year >= aw_year_st-10, ]
ggplot() +
geom_rect(data=d, mapping=aes(xmin=aw_year_st, xmax=aw_year_end, ymin=0, ymax=.4),alpha=0.1, fill = "salmon") +
geom_line(data = aw, aes(x = year, y = cinc, color = stateabb, group = stateabb)) + facet_wrap(~side)

irst<- ggplot() +
geom_rect(data=d, mapping=aes(xmin=aw_year_st, xmax=aw_year_end, ymin=0, ymax=max(aw$irst)),alpha=0.1, fill = "salmon") +
geom_line(data = aw, aes(x = year, y = irst, color = stateabb, group = stateabb)) + facet_wrap(~side)
ex<-ggplot() +
geom_rect(data=d, mapping=aes(xmin=aw_year_st, xmax=aw_year_end, ymin=0, ymax=max(aw$milex)),alpha=0.1, fill = "salmon") +
geom_line(data = aw, aes(x = year, y = milex, color = stateabb, group = stateabb)) + facet_wrap(~side)
per<-ggplot() +
geom_rect(data=d, mapping=aes(xmin=aw_year_st, xmax=aw_year_end, ymin=0, ymax=max(aw$milper)),alpha=0.1, fill = "salmon") +
geom_line(data = aw, aes(x = year, y = milper, color = stateabb, group = stateabb)) + facet_wrap(~side)
pec<-ggplot() +
geom_rect(data=d, mapping=aes(xmin=aw_year_st, xmax=aw_year_end, ymin=0, ymax=max(aw$pec)),alpha=0.1, fill = "salmon") +
geom_line(data = aw, aes(x = year, y = pec, color = stateabb, group = stateabb)) + facet_wrap(~side)
upop<-ggplot() +
geom_rect(data=d, mapping=aes(xmin=aw_year_st, xmax=aw_year_end, ymin=0, ymax=max(aw$upop)),alpha=0.1, fill = "salmon") +
geom_line(data = aw, aes(x = year, y = upop, color = stateabb, group = stateabb)) + facet_wrap(~side)
tpop<-ggplot() +
geom_rect(data=d, mapping=aes(xmin=aw_year_st, xmax=aw_year_end, ymin=0, ymax=max(aw$tpop)),alpha=0.1, fill = "salmon") +
geom_line(data = aw, aes(x = year, y = tpop, color = stateabb, group = stateabb)) + facet_wrap(~side)
grid.arrange(irst, ex, per, pec, tpop, upop , nrow = 3)

## looking at ratios
nmc_c2 <-nmc_c
#nmc_c2$irst <- nmc_c2$irst/max(nmc_c2$irst)
#nmc_c2$milex <- nmc_c2$milex/max(nmc_c2$milex)
#nmc_c2$milper <- nmc_c2$milper/max(nmc_c2$milper)
#nmc_c2$pec <- nmc_c2$pec/max(nmc_c2$pec)
#nmc_c2$tpop <- nmc_c2$tpop/max(nmc_c2$tpop)
#nmc_c2$upop <- nmc_c2$upop/max(nmc_c2$upop)
nmc_c3<- gather(nmc_c2, metric, value, irst:upop)
ggplot() +
geom_rect(data=d, mapping=aes(xmin = x1, xmax=x2, ymin=0, ymax=1, fill = Conflict ),alpha=0.25) +
geom_line(data = nmc_c3, aes(x = year, y = value, color = stateabb), alpha = 1) + facet_wrap(~metric)

Calculate Ratios
NMC = read.csv(paste(path, "NMC/NMC_v4_0.csv", sep= "/"))
NMC$cinc[NMC$cinc == -9] <- 0
NMC$irst[NMC$irst == -9] <- 0
NMC$milex[NMC$milex == -9] <- 0
NMC$milper[NMC$milper== -9] <- 0
NMC$pec[NMC$pec == -9] <- 0
NMC$tpop[NMC$tpop == -9] <- 0
NMC$upop[NMC$upop == -9] <- 0
ggplot(NMC[NMC$year > 1900,], aes(stateabb, year, fill = cinc)) + geom_tile()+
scale_fill_viridis() + ggtitle("Heatmap of cinc") + theme(axis.text.x = element_text(angle = 60, hjust = 1),plot.title = element_text(hjust = 0.5))

all_year <- c(1900:2007)
NMC$cinc[NMC$cinc == -9| is.na(NMC$cinc)] <- 0
NMC$irst[NMC$irst == -9| is.na(NMC$irst)] <- 0
NMC$milex[NMC$milex == -9| is.na(NMC$milex)] <- 0
NMC$milper[NMC$milper== -9| is.na(NMC$milper)] <- 0
NMC$pec[NMC$pec == -9| is.na(NMC$pec)] <- 0
NMC$tpop[NMC$tpop == -9| is.na(NMC$tpop)] <- 0
NMC$upop[NMC$upop == -9| is.na(NMC$upop)] <- 0
NMC$irst <- as.numeric(NMC$irst)
NMC$milex <- as.numeric(NMC$milex)
NMC$milper <- as.numeric(NMC$milper)
NMC$pec <- as.numeric(NMC$pec)
NMC$tpop <- as.numeric(NMC$tpop)
NMC$upop <- as.numeric(NMC$upop)
NMC$cinc <- as.numeric(NMC$cinc)
NMC$year <- as.numeric(NMC$year)
yr2000 <- NMC[NMC$year == 1971, ]
apply(yr2000, 2, max)
stateabb ccode year irst milex milper pec tpop upop cinc version
"ZIM" "950" "1971" "121000" "82700000" "3900" "9.671694e+03" "851419" "100470" "0.17401890" "4"
NMC2 <- c("")
for (year_t in all_year){
yr <- NMC[NMC$year == year_t, ]
max <- apply(yr, 2, max)
max <- as.numeric(max[4:9])
for (i in 4:9){
yr[,i] = yr[,i]/max[i-3]
}
NMC2 <- rbind(NMC2, yr)
}
invalid factor level, NA generated
NMC2 <- NMC2[c(2:nrow(NMC2)),]
d=data.frame(x1=c(1914,1939, 1947, 1950, 1955, 2001), x2=c(1918, 1945, 1991, 1953, 1975, 2010), y1=c(0,0,0,0,0,0), y2=c(.4,.4,.4,.4,.4,.4), Conflict=c("WWI", "WWII", "Cold War", "Korean War", "Vietnam War", "Afghanistan War"), r=c(1,2,3,4,5,6))
NMC2_yr<- NMC2[NMC2$year > 1900,]
countries <- c("United States of America", "United Kingdom", "France", "Russia","Germany", "Italy", "Japan", "China")
country_code <- member_alliances$ccode[match(countries, member_alliances$state_name)]
NMC2_yr <- filter(NMC2_yr, NMC2_yr$ccode %in% country_code )
NMC_orig_yr <- filter(NMC, NMC$ccode %in% country_code )
NMC2_yr$irst <- as.numeric(NMC2_yr$irst)
NMC2_yr$milex <- as.numeric(NMC2_yr$milex)
NMC2_yr$milper <- as.numeric(NMC2_yr$milper)
NMC2_yr$pec <- as.numeric(NMC2_yr$pec)
NMC2_yr$tpop <- as.numeric(NMC2_yr$tpop)
NMC2_yr$upop <- as.numeric(NMC2_yr$upop)
NMC2_yr$cinc <- as.numeric(NMC2_yr$cinc)
NMC2_yr$year <- as.numeric(NMC2_yr$year)
a<- ggplot() +
geom_rect(data=d, mapping=aes(xmin=x1, xmax=x2, ymin=0, ymax=1, fill=Conflict),alpha=0.15) +
geom_line(data = NMC2_yr, aes(x = year, y = irst, color = stateabb, group = stateabb))+ theme(legend.position="none")
a2<- ggplot() +
geom_rect(data=d, mapping=aes(xmin=x1, xmax=x2, ymin=0, ymax=1, fill=Conflict),alpha=0.15) +
geom_line(data = NMC_orig_yr, aes(x = year, y = irst, color = stateabb, group = stateabb))+ theme(legend.position="none")
b<-ggplot() +
geom_rect(data=d, mapping=aes(xmin=x1, xmax=x2, ymin=0, ymax=1, fill=Conflict),alpha=0.15) +
geom_line(data = NMC2_yr, aes(x = year, y = milex, color = stateabb, group = stateabb))+ theme(legend.position="none")
b2<- ggplot() +
geom_rect(data=d, mapping=aes(xmin=x1, xmax=x2, ymin=0, ymax=1, fill=Conflict),alpha=0.15) +
geom_line(data = NMC_orig_yr, aes(x = year, y = irst, color = stateabb, group = stateabb))+ theme(legend.position="none")
c<-ggplot() +
geom_rect(data=d, mapping=aes(xmin=x1, xmax=x2, ymin=0, ymax=1, fill=Conflict),alpha=0.15) +
geom_line(data = NMC2_yr, aes(x = year, y = milper, color = stateabb, group = stateabb))+ theme(legend.position="none")
c2<- ggplot() +
geom_rect(data=d, mapping=aes(xmin=x1, xmax=x2, ymin=0, ymax=1, fill=Conflict),alpha=0.15) +
geom_line(data = NMC_orig_yr, aes(x = year, y = irst, color = stateabb, group = stateabb))+ theme(legend.position="none")
d2<- ggplot() +
geom_rect(data=d, mapping=aes(xmin=x1, xmax=x2, ymin=0, ymax=1, fill=Conflict),alpha=0.15) +
geom_line(data = NMC_orig_yr, aes(x = year, y = irst, color = stateabb, group = stateabb))+ theme(legend.position="none")
d<-ggplot() +
geom_rect(data=d, mapping=aes(xmin=x1, xmax=x2, ymin=0, ymax=1, fill=Conflict),alpha=0.15) +
geom_line(data = NMC2_yr, aes(x = year, y = tpop, color = stateabb, group = stateabb))+ theme(legend.position="none")
grid.arrange(a,a2, b, b2, c, c2, d ,nrow = 4 )

LS0tCnRpdGxlOiAiTk1DIEFuYWx5c2lzIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgoKYGBge3J9CmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShncmlkKQpsaWJyYXJ5KGdyaWRFeHRyYSkKbGlicmFyeSh0aWR5cikKbGlicmFyeShkcGx5cikKbGlicmFyeSh2aXJpZGlzKQpsaWJyYXJ5KG9jZSkKbGlicmFyeSh2Y2QpCmxpYnJhcnkodmNkRXh0cmEpCmxpYnJhcnkoZXh0cmFjYXQpCgojIyBTZXQgZmlsZSBwYXRoCnBhdGggPSAiL1VzZXJzL2N5bnRoaWFjbGVtZW50L0Rlc2t0b3AiCgojIyBkZWZpbmUgeWVhciByYW5nZSB0byBsb29rIGF0IAp5ZWFyX21pbiA9IDE5MTAKeWVhcl91c2Rldl9tYXggPSAyMDEwIAoKbWVtYmVyX2FsbGlhbmNlcyA9IHJlYWQuY3N2KHBhc3RlKHBhdGgsICJ2ZXJzaW9uNC4xX2Nzdi9hbGxpYW5jZV92NC4xX2J5X21lbWJlci5jc3YiLCBzZXA9ICIvIikpCk5NQyA9IHJlYWQuY3N2KHBhc3RlKHBhdGgsICJOTUMvTk1DX3Y0XzAuY3N2Iiwgc2VwPSAiLyIpKQoKTk1DJGNpbmNbTk1DJGNpbmMgPT0gLTldIDwtIDAKTk1DJGlyc3RbTk1DJGlyc3QgPT0gLTldIDwtIDAKTk1DJG1pbGV4W05NQyRtaWxleCA9PSAtOV0gPC0gMApOTUMkbWlscGVyW05NQyRtaWxwZXI9PSAtOV0gPC0gMApOTUMkcGVjW05NQyRwZWMgPT0gLTldIDwtIDAKTk1DJHRwb3BbTk1DJHRwb3AgPT0gLTldIDwtIDAKTk1DJHVwb3BbTk1DJHVwb3AgPT0gLTldIDwtIDAKCgpkPWRhdGEuZnJhbWUoeDE9YygxOTE0LDE5MzksIDE5NDcsIDE5NTAsIDE5NTUsIDIwMDEpLCB4Mj1jKDE5MTgsIDE5NDUsIDE5OTEsIDE5NTMsIDE5NzUsIDIwMTApLCBDb25mbGljdD1jKCJXV0kiLCAiV1dJSSIsICJDb2xkIFdhciIsICJLb3JlYW4gV2FyIiwgIlZpZXRuYW0gV2FyIiwgIkFmZ2hhbmlzdGFuIFdhciIpLCByPWMoMSwyLDMsNCw1LDYpKQpgYGAKCgoKI05NQyBPdmVyYWxsIAoKVGhlIENvbXBvc2l0ZSBJbmRleCBvZiBOYXRpb25hbCBDYXBhYmlsaXR5IChDSU5DKSBpcyBhIHN0YXRpc3RpY2FsIG1lYXN1cmUgb2YgbmF0aW9uYWwuIEl0IHVzZXMgYW4gYXZlcmFnZSBvZiBwZXJjZW50YWdlcyBvZiB3b3JsZCB0b3RhbHMgaW4gc2l4IGRpZmZlcmVudCBjb21wb25lbnRzLlRoZSBjb21wb25lbnRzIHJlcHJlc2VudCBkZW1vZ3JhcGhpYywgZWNvbm9taWMsIGFuZCBtaWxpdGFyeSBzdHJlbmd0aC4gIAogIApUUFIgPSB0b3RhbCBwb3B1bGF0aW9uIG9mIGNvdW50cnkgcmF0aW8gIApVUFIgPSB1cmJhbiBwb3B1bGF0aW9uIG9mIGNvdW50cnkgcmF0aW8gIApJU1BSID0gaXJvbiBhbmQgc3RlZWwgcHJvZHVjdGlvbiBvZiBjb3VudHJ5IHJhdGlvICAKRUNSID0gcHJpbWFyeSBlbmVyZ3kgY29uc3VtcHRpb24gcmF0aW8gIApNRVIgPSBtaWxpdGFyeSBleHBlbmRpdHVyZSByYXRpbyAgCk1QUiA9IG1pbGl0YXJ5IHBlcnNvbm5lbCByYXRpbyAgCgojIyMgQ3VycmVudCBXb3JsZCBQb3dlcnMKCmBgYHtyIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD0xMn0KY291bnRyaWVzIDwtIGMoIlVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYSIsICJVbml0ZWQgS2luZ2RvbSIsICJGcmFuY2UiLCAiUnVzc2lhIiwiR2VybWFueSIsICJJdGFseSIsICJKYXBhbiIsICJDaGluYSIpCmNvdW50cnlfY29kZSA8LSBtZW1iZXJfYWxsaWFuY2VzJGNjb2RlW21hdGNoKGNvdW50cmllcywgbWVtYmVyX2FsbGlhbmNlcyRzdGF0ZV9uYW1lKV0KCm5tY19jICA8LSBjKCIiKQpmb3IoY29kZSBpbiBjb3VudHJ5X2NvZGUpewogIG5tY19jIDwtIHJiaW5kKG5tY19jLCBOTUNbTk1DJGNjb2RlID09IGFzLm51bWVyaWMoY29kZSksXSkKfQoKbm1jX2MgPC0gbm1jX2NbYygyOm5yb3cobm1jX2MpKSxdCm5tY19jJGlyc3QgPC0gYXMubnVtZXJpYyhubWNfYyRpcnN0KQpubWNfYyRtaWxleCA8LSBhcy5udW1lcmljKG5tY19jJG1pbGV4KQpubWNfYyRtaWxwZXIgPC0gYXMubnVtZXJpYyhubWNfYyRtaWxwZXIpCm5tY19jJHBlYyA8LSBhcy5udW1lcmljKG5tY19jJHBlYykKbm1jX2MkdHBvcCA8LSBhcy5udW1lcmljKG5tY19jJHRwb3ApCm5tY19jJHVwb3AgPC0gYXMubnVtZXJpYyhubWNfYyR1cG9wKQpubWNfYyRjaW5jIDwtIGFzLm51bWVyaWMobm1jX2MkY2luYykKbm1jX2MkeWVhciA8LSBhcy5udW1lcmljKG5tY19jJHllYXIpICAgIAoKCiMjIGNyZWF0ZSBpbmRpdmlkdWFsIHBsb3RzIG9mIHRoZSA2IGZhY3RvcnMgaW4gQ0lOQwoKaXJzdCA8LSBnZ3Bsb3Qobm1jX2Nbbm1jX2MkeWVhciA+IDE5MzAsXSwgYWVzKHllYXIgLCBpcnN0LCBjb2xvciA9IHN0YXRlYWJiLCBncm91cCA9IHN0YXRlYWJiKSkgKyBnZW9tX3BvaW50KGFscGhhID0gMS8xMDApICsgZ2VvbV9saW5lKCkgICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxKSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsgZ2d0aXRsZSgiSXJvbiBhbmQgU3RlZWwgUHJvZHVjdGlvbiIpCmV4IDwtIGdncGxvdChubWNfY1tubWNfYyR5ZWFyID4gMTkzMCxdLCBhZXMoeWVhciAsIG1pbGV4LCBjb2xvciA9IHN0YXRlYWJiLCBncm91cCA9IHN0YXRlYWJiKSkgKyBnZW9tX3BvaW50KGFscGhhID0gMS8xMDApICsgZ2VvbV9saW5lKCkgICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxKSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsgZ2d0aXRsZSgiTWlsaXRhcnkgRXhwZW5kaXR1cmVzIikKcGVyIDwtIGdncGxvdChubWNfY1tubWNfYyR5ZWFyID4gMTkzMCxdLCBhZXMoeWVhciAsIG1pbHBlciwgY29sb3IgPSBzdGF0ZWFiYiwgZ3JvdXAgPSBzdGF0ZWFiYikpICsgZ2VvbV9wb2ludChhbHBoYSA9IDEvMTAwKSArIGdlb21fbGluZSgpICArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSksIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArIGdndGl0bGUoIk1pbGl0YXJ5IFBlcnNvbmVsbCIpCnBlYyA8LSBnZ3Bsb3Qobm1jX2Nbbm1jX2MkeWVhciA+IDE5MzAsXSwgYWVzKHllYXIgLCBwZWMsIGNvbG9yID0gc3RhdGVhYmIsIGdyb3VwID0gc3RhdGVhYmIpKSArIGdlb21fcG9pbnQoYWxwaGEgPSAxLzEwMCkgKyBnZW9tX2xpbmUoKSAgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKyBnZ3RpdGxlKCJQcmltYXJ5IEVuZXJneSBDb25zdW1wdGlvbiBSYXRpbyIpCnRwb3AgPC0gZ2dwbG90KG5tY19jW25tY19jJHllYXIgPiAxOTMwLF0sIGFlcyh5ZWFyICwgdHBvcCwgY29sb3IgPSBzdGF0ZWFiYiwgZ3JvdXAgPSBzdGF0ZWFiYikpICsgZ2VvbV9wb2ludChhbHBoYSA9IDEvMTAwKSArIGdlb21fbGluZSgpICArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSksIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArIGdndGl0bGUoIlRvdGFsIFBvcHVsYXRpb24iKQp1cG9wIDwtIGdncGxvdChubWNfY1tubWNfYyR5ZWFyID4gMTkzMCxdLCBhZXMoeWVhciAsIHVwb3AsIGNvbG9yID0gc3RhdGVhYmIsIGdyb3VwID0gc3RhdGVhYmIpKSArIGdlb21fcG9pbnQoYWxwaGEgPSAxLzEwMCkgKyBnZW9tX2xpbmUoKSAgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKyBnZ3RpdGxlKCJVcmJhbiBQb3B1bGF0aW9uIikKZ3JpZC5hcnJhbmdlKGlyc3QsIGV4LCBwZXIsIHBlYywgdHBvcCwgdXBvcCAsIG5yb3cgPSAzKQoKYGBgCgpgYGB7cn0KIyMgY3JlYXRlIHBsb3RzIG9mIENJTkMgYW5kIG1hcmsgdGhlIGRpZmZlcmVudCBjb25mbGljdHMgd2UgYXJlIGxvb2tpbmcgYXQgCgpkPWRhdGEuZnJhbWUoeDE9YygxOTE0LDE5MzksIDE5NDcsIDE5NTAsIDE5NTUsIDIwMDEpLCB4Mj1jKDE5MTgsIDE5NDUsIDE5OTEsIDE5NTMsIDE5NzUsIDIwMTApLCB5MT1jKDAsMCwwLDAsMCwwKSwgeTI9YyguNCwuNCwuNCwuNCwuNCwuNCksIENvbmZsaWN0PWMoIldXSSIsICJXV0lJIiwgIkNvbGQgV2FyIiwgIktvcmVhbiBXYXIiLCAiVmlldG5hbSBXYXIiLCAiQWZnaGFuaXN0YW4gV2FyIiksIHI9YygxLDIsMyw0LDUsNikpCm5tY195cjwtIG5tY19jW25tY19jJHllYXIgPiAxOTAwLF0KZ2dwbG90KCkgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZT0ieCIpICsgCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWU9InkiKSArCiAgZ2VvbV9yZWN0KGRhdGE9ZCwgbWFwcGluZz1hZXMoeG1pbj14MSwgeG1heD14MiwgeW1pbj15MSwgeW1heD1tYXgobm1jX3lyJHBlYyksIGZpbGw9Q29uZmxpY3QpLGFscGhhPTAuMTUpICsKICBnZW9tX3JlY3QoZGF0YSA9IGQsIG1hcHBpbmcgPSBhZXMoeG1pbj0xOTMyLCB4bWF4PTE5MzksIHltaW49MCwgeW1heD1tYXgobm1jX3lyJHBlYykpLCBhbHBoYSA9IDEsIGNvbG9yID0gInJlZCIpKwogIGdlb21fcmVjdChkYXRhID0gZCwgbWFwcGluZyA9IGFlcyh4bWluPTE5NDEsIHhtYXg9MTk0MSwgeW1pbj0wLCB5bWF4PW1heChubWNfeXIkcGVjKSksIGFscGhhID0xLCBjb2xvciA9ICJibHVlIikgKwogIGdlb21fbGluZShkYXRhID0gbm1jX3lyLCBhZXMoeCA9IHllYXIsIHkgPSBwZWMsIGNvbG9yID0gc3RhdGVhYmIsIGdyb3VwID0gc3RhdGVhYmIpKQoKCmBgYAoKCmBgYHtyfQojIyBIZWF0bWFwIG9mIENOSUMgCgpnZ3Bsb3Qobm1jX2Nbbm1jX2MkeWVhciA+IDE5MDAsXSwgYWVzKHN0YXRlYWJiLCB5ZWFyLCBmaWxsID0gY2luYykpICsgZ2VvbV90aWxlKCkrCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKyBnZ3RpdGxlKCJIZWF0bWFwIG9mIGNpbmMiKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNjAsIGhqdXN0ID0gMSkscGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCgoKYGBgCgoKYGBge3J9CiMjUENQIFBMb3QgCmxpYnJhcnkoR0dhbGx5KQpjdCA8LSBnZ3BhcmNvb3JkKG5tY19jW25tY19jJHllYXI+MTkzMCxdLCBjb2x1bW5zID0gNDoxMCwgc2NhbGUgPSAidW5pbWlubWF4IiwgYWxwaGFMaW5lcyA9IC4yLCBncm91cENvbHVtbiA9ICJzdGF0ZWFiYiIpCnlyIDwtIGdncGFyY29vcmQobm1jX2Nbbm1jX2MkeWVhcj4xOTMwLF0sIGNvbHVtbnMgPSA0OjEwLCBzY2FsZSA9ICJ1bmltaW5tYXgiLCBhbHBoYUxpbmVzID0gLjIsIGdyb3VwQ29sdW1uID0gInllYXIiKQpncmlkLmFycmFuZ2UoY3QsIHlyLCBucm93ID0gMikKCgpgYGAKCgoKIyNXb3JsZCBXYXIgSQogIApJbiB0aGUgYWZ0ZXJtYXRoIG9mIHRoZSB3YXIsIGZvdXIgZW1waXJlcyBkaXNhcHBlYXJlZDogdGhlIEdlcm1hbiwgQXVzdHJvLUh1bmdhcmlhbiwgT3R0b21hbiwgYW5kIFJ1c3NpYW4uIE51bWVyb3VzIG5hdGlvbnMgcmVnYWluZWQgdGhlaXIgZm9ybWVyIGluZGVwZW5kZW5jZSwgYW5kIG5ldyBvbmVzIHdlcmUgY3JlYXRlZC5Gb3VyIGR5bmFzdGllcywgdG9nZXRoZXIgd2l0aCB0aGVpciBhbmNpbGxhcnkgYXJpc3RvY3JhY2llcywgYWxsIGZlbGwgYXMgYSByZXN1bHQgb2YgdGhlIHdhcjogdGhlIFJvbWFub3ZzLCB0aGUgSG9oZW56b2xsZXJucywgdGhlIEhhYnNidXJncywgYW5kIHRoZSBPdHRvbWFucy4gQmVsZ2l1bSBhbmQgU2VyYmlhIHdlcmUgYmFkbHkgZGFtYWdlZCwgYXMgd2FzIEZyYW5jZSwgd2l0aCAxLjQgbWlsbGlvbiBzb2xkaWVycyBkZWFkLFsxODNdIG5vdCBjb3VudGluZyBvdGhlciBjYXN1YWx0aWVzLiBHZXJtYW55IGFuZCBSdXNzaWEgd2VyZSBzaW1pbGFybHkgYWZmZWN0ZWQKCmBgYHtyfQphbGxpZWQgPC0gYygiVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhIiwgIlVuaXRlZCBLaW5nZG9tIiwgIlJ1c3NpYSIsICJKYXBhbiIsICJJdGFseSIpCmFsbGllZF9jY29kZSA8LSBtZW1iZXJfYWxsaWFuY2VzJGNjb2RlW21hdGNoKGFsbGllZCwgbWVtYmVyX2FsbGlhbmNlcyRzdGF0ZV9uYW1lKV0KCmNlbnRyYWwgPC0gYygiR2VybWFueSIsICJUdXJrZXkiLCAiQXVzdHJpYS1IdW5nYXJ5IiwgIlJvbWFuaWEiLCAiQnVsZ2FyaWEiKQpjZW50cmFsX2Njb2RlIDwtIG1lbWJlcl9hbGxpYW5jZXMkY2NvZGVbbWF0Y2goY2VudHJhbCwgbWVtYmVyX2FsbGlhbmNlcyRzdGF0ZV9uYW1lKV0KCgpXV0lfeXJNYXggPSAxOTI4CldXSV95ck1pbiA9IDE5MDQKCldXSSA8LSBOTUMKCmFsbGllZFBfbm1jIDwtIGMoIiIpCmZvcihjb2RlIGluIGFsbGllZF9jY29kZSl7CiAgYWxsaWVkUF9ubWMgPC0gcmJpbmQoYWxsaWVkUF9ubWMsIFdXSVtXV0kkY2NvZGUgPT0gYXMubnVtZXJpYyhjb2RlKSxdKQp9CmFsbGllZFBfbm1jICA8LSBhbGxpZWRQX25tYyBbYygyOm5yb3coYWxsaWVkUF9ubWMgKSksXQphbGxpZWRQX25tYyRzaWRlID0gIkFsbGllZCBQb3dlcnMiCgpjZW50cmFsUF9ubWMgPC0gYygiIikKZm9yKGNvZGUgaW4gY2VudHJhbF9jY29kZSl7CiAgY2VudHJhbFBfbm1jIDwtIHJiaW5kKGNlbnRyYWxQX25tYywgTk1DW05NQyRjY29kZSA9PSBhcy5udW1lcmljKGNvZGUpLF0pCn0KY2VudHJhbFBfbm1jIDwtIGNlbnRyYWxQX25tY1tjKDI6bnJvdyhjZW50cmFsUF9ubWMpKSxdCmNlbnRyYWxQX25tYyRzaWRlID0gIkNlbnRyYWwgUG93ZXJzIgoKCldXSSA8LXJiaW5kKGFsbGllZFBfbm1jLGNlbnRyYWxQX25tYykKV1dJJG1pbGV4IDwtIGFzLm51bWVyaWMoV1dJJG1pbGV4KQpXV0kkbWlscGVyIDwtIGFzLm51bWVyaWMoV1dJJG1pbHBlcikKV1dJJHBlYyA8LSBhcy5udW1lcmljKFdXSSRwZWMpCldXSSR0cG9wIDwtIGFzLm51bWVyaWMoV1dJJHRwb3ApCldXSSR1cG9wIDwtIGFzLm51bWVyaWMoV1dJJHVwb3ApCldXSSRjaW5jIDwtIGFzLm51bWVyaWMoV1dJJGNpbmMpCldXSSR5ZWFyIDwtIGFzLm51bWVyaWMoV1dJJHllYXIpCldXSSRpcnN0IDwtIGFzLm51bWVyaWMoV1dJJGlyc3QpCgoKV1dJIDwtIFdXSVtXV0kkeWVhciA+PSBXV0lfeXJNaW4sIF0KV1dJIDwtIFdXSVtXV0kkeWVhciA8PSBXV0lfeXJNYXgsIF0KCmBgYAoKCmBgYHtyfQpkPWRhdGEuZnJhbWUoeDE9YygxOTM5KSwgeDI9YygxOTE4LCAxOTQ1LCAxOTkxLCAxOTUzLCAxOTc1LCAyMDEwKSwgeTE9YygwLDAsMCwwLDAsMCksIHkyPWMoLjQsLjQsLjQsLjQsLjQsLjQpLCBDb25mbGljdD1jKCJXV0kiLCAiV1dJSSIsICJDb2xkIFdhciIsICJLb3JlYW4gV2FyIiwgIlZpZXRuYW0gV2FyIiwgIkFmZ2hhbmlzdGFuIFdhciIpLCByPWMoMSwyLDMsNCw1LDYpKQpnZ3Bsb3QoKSArIAogIGdlb21fcmVjdChkYXRhPWQsIG1hcHBpbmc9YWVzKHhtaW49MTkxNCwgeG1heD0xOTE4LCB5bWluPTAsIHltYXg9LjQpLGFscGhhPTAuMSwgZmlsbCA9ICJzYWxtb24iKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBXV0ksIGFlcyh4ID0geWVhciwgeSA9IGNpbmMsIGNvbG9yID0gc3RhdGVhYmIsIGdyb3VwID0gc3RhdGVhYmIpKSArIGZhY2V0X3dyYXAofnNpZGUpCgoKYGBgCgpgYGB7cn0KZ2dwbG90KCkgKyAKICBnZW9tX3JlY3QoZGF0YT1kLCBtYXBwaW5nPWFlcyh4bWluPTE5MTQsIHhtYXg9MTkxOCwgeW1pbj0wLCB5bWF4PW1heChXV0kkaXJzdCkpLGFscGhhPTAuMSwgZmlsbCA9ICJzYWxtb24iKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBXV0ksIGFlcyh4ID0geWVhciwgeSA9IGlyc3QsIGNvbG9yID0gc3RhdGVhYmIsIGdyb3VwID0gc3RhdGVhYmIpKSArIGZhY2V0X3dyYXAofnNpZGUpCgpgYGAKCmBgYHtyfQpnZ3Bsb3QoKSArIAogIGdlb21fcmVjdChkYXRhPWQsIG1hcHBpbmc9YWVzKHhtaW49MTkxNCwgeG1heD0xOTE4LCB5bWluPTAsIHltYXg9IG1heChXV0kkbWlsZXgpKSxhbHBoYT0wLjEsIGZpbGwgPSAic2FsbW9uIikgKwogIGdlb21fbGluZShkYXRhID0gV1dJLCBhZXMoeCA9IHllYXIsIHkgPSBtaWxleCwgY29sb3IgPSBzdGF0ZWFiYiwgZ3JvdXAgPSBzdGF0ZWFiYikpICsgZmFjZXRfd3JhcCh+c2lkZSkKCmBgYAoKYGBge3J9CmdncGxvdCgpICsgCiAgZ2VvbV9yZWN0KGRhdGE9ZCwgbWFwcGluZz1hZXMoeG1pbj0xOTE0LCB4bWF4PTE5MTgsIHltaW49MCwgeW1heD0gbWF4KFdXSSRtaWxleCkpLGFscGhhPTAuMSwgZmlsbCA9ICJzYWxtb24iKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBXV0ksIGFlcyh4ID0geWVhciwgeSA9IG1pbGV4LCBjb2xvciA9IHN0YXRlYWJiLCBncm91cCA9IHN0YXRlYWJiKSkgKyBmYWNldF93cmFwKH5zaWRlKQoKYGBgCgoKYGBge3J9CmdncGxvdCgpICsgCiAgZ2VvbV9yZWN0KGRhdGE9ZCwgbWFwcGluZz1hZXMoeG1pbj0xOTE0LCB4bWF4PTE5MTgsIHltaW49MCwgeW1heD1tYXgoV1dJJG1pbHBlcikpLGFscGhhPTAuMSwgZmlsbCA9ICJzYWxtb24iKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBXV0ksIGFlcyh4ID0geWVhciwgeSA9IG1pbHBlciwgY29sb3IgPSBzdGF0ZWFiYiwgZ3JvdXAgPSBzdGF0ZWFiYikpICsgZmFjZXRfd3JhcCh+c2lkZSkKCmBgYAoKYGBge3J9CmdncGxvdCgpICsgCiAgZ2VvbV9yZWN0KGRhdGE9ZCwgbWFwcGluZz1hZXMoeG1pbj0xOTE0LCB4bWF4PTE5MTgsIHltaW49MCwgeW1heD1tYXgoV1dJJHBlYykpLGFscGhhPTAuMSwgZmlsbCA9ICJzYWxtb24iKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBXV0ksIGFlcyh4ID0geWVhciwgeSA9IHBlYywgY29sb3IgPSBzdGF0ZWFiYiwgZ3JvdXAgPSBzdGF0ZWFiYikpICsgZmFjZXRfd3JhcCh+c2lkZSkKCgpgYGAKCgpgYGB7cn0KZ2dwbG90KCkgKyAKICBnZW9tX3JlY3QoZGF0YT1kLCBtYXBwaW5nPWFlcyh4bWluPTE5MTQsIHhtYXg9MTkxOCwgeW1pbj0wLCB5bWF4PW1heChXV0kkdHBvcCkpLGFscGhhPTAuMSwgZmlsbCA9ICJzYWxtb24iKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBXV0ksIGFlcyh4ID0geWVhciwgeSA9IHRwb3AsIGNvbG9yID0gc3RhdGVhYmIsIGdyb3VwID0gc3RhdGVhYmIpKSArIGZhY2V0X3dyYXAofnNpZGUpCgpgYGAKCmBgYHtyfQpnZ3Bsb3QoKSArIAogIGdlb21fcmVjdChkYXRhPWQsIG1hcHBpbmc9YWVzKHhtaW49MTkxNCwgeG1heD0xOTE4LCB5bWluPTAsIHltYXg9bWF4KFdXSSR1cG9wKSksYWxwaGE9MC4xLCBmaWxsID0gInNhbG1vbiIpICsKICBnZW9tX2xpbmUoZGF0YSA9IFdXSSwgYWVzKHggPSB5ZWFyLCB5ID0gdXBvcCwgY29sb3IgPSBzdGF0ZWFiYiwgZ3JvdXAgPSBzdGF0ZWFiYikpICsgZmFjZXRfd3JhcCh+c2lkZSkKCgpgYGAKCgojI1dvcmxkIFdhciBJSSAoMTkzOS0xOTQ1KQoKYGBge3J9CgphbGxpZXMgPC0gYygiVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhIiwgIlVuaXRlZCBLaW5nZG9tIiwgIkZyYW5jZSIsICJSdXNzaWEiLCAiQXVzdHJhbGlhIiwgIkJlbGdpdW0iLCAiQnJhemlsIiwgIkNhbmFkYSIsICJDaGluYSIsICJEZW5tYXJrIiwgIkdyZWVjZSIsICJOZXRoZXJsYW5kcyIsICJOZXcgWmVhbGFuZCIsICJOb3J3YXkiLCAiUG9sYW5kIiwgIlNvdXRoIEFmcmljYSIsICJZdWdvc2xhdmlhIikKYWxsaWVzX2Njb2RlIDwtIG1lbWJlcl9hbGxpYW5jZXMkY2NvZGVbbWF0Y2goYWxsaWVzLCBtZW1iZXJfYWxsaWFuY2VzJHN0YXRlX25hbWUpXQoKYXhpcyA8LSBjKCJHZXJtYW55IiwgIkl0YWx5IiwgIkphcGFuIiwgIkh1bmdhcnkiLCAiUm9tYW5pYSIsICJCdWxnYXJpYSIpCmF4aXNfY2NvZGUgPC0gbWVtYmVyX2FsbGlhbmNlcyRjY29kZVttYXRjaChheGlzLCBtZW1iZXJfYWxsaWFuY2VzJHN0YXRlX25hbWUpXQoKIyMgVVMsIEdCLEpBUCwgR2VybW4sIEZyYW5jZSwgSXRhbHksIFJ1c3NpYQoKV1dJSV95ZWFyX3N0ID0gMTkzOQpXV0lJX3llYXJfZW5kID0gMTk0NQoKYWxsaWVzX25tYyA8LSBjKCIiKQpmb3IoY29kZSBpbiBhbGxpZXNfY2NvZGUpewogIGFsbGllc19ubWMgPC0gcmJpbmQoYWxsaWVzX25tYywgTk1DW05NQyRjY29kZSA9PSBhcy5udW1lcmljKGNvZGUpLF0pCn0KYWxsaWVzX25tYyAgPC0gYWxsaWVzX25tYyBbYygyOm5yb3coYWxsaWVzX25tYyApKSxdCmFsbGllc19ubWMkc2lkZSA9ICJBbGxpZWQgUG93ZXJzIgpheGlzX25tYyA8LSBjKCIiKQpmb3IoY29kZSBpbiBheGlzX2Njb2RlKXsKICBheGlzX25tYyA8LSByYmluZChheGlzX25tYywgTk1DW05NQyRjY29kZSA9PSBhcy5udW1lcmljKGNvZGUpLF0pCn0KYXhpc19ubWMgPC0gYXhpc19ubWNbYygyOm5yb3coYXhpc19ubWMpKSxdCmF4aXNfbm1jJHNpZGUgPSAiQXhpcyBQb3dlcnMiCgpXV0lJIDwtcmJpbmQoYWxsaWVzX25tYyxheGlzX25tYykKV1dJSSRpcnN0IDwtIGFzLm51bWVyaWMoV1dJSSRpcnN0KQpXV0lJJG1pbGV4IDwtIGFzLm51bWVyaWMoV1dJSSRtaWxleCkKV1dJSSRtaWxwZXIgPC0gYXMubnVtZXJpYyhXV0lJJG1pbHBlcikKV1dJSSRwZWMgPC0gYXMubnVtZXJpYyhXV0lJJHBlYykKV1dJSSR0cG9wIDwtIGFzLm51bWVyaWMoV1dJSSR0cG9wKQpXV0lJJHVwb3AgPC0gYXMubnVtZXJpYyhXV0lJJHVwb3ApCldXSUkkY2luYyA8LSBhcy5udW1lcmljKFdXSUkkY2luYykKV1dJSSR5ZWFyIDwtIGFzLm51bWVyaWMoV1dJSSR5ZWFyKQoKV1dJSSA8LSBXV0lJW1dXSUkkeWVhciA8IDE5NTAsXQpXV0lJIDwtIFdXSUlbV1dJSSR5ZWFyID4gMTkzNCxdCgpgYGAKCgpgYGB7cn0KIyMgY3JlYXRlIHBsb3RzIG9mIENJTkMgYW5kIG1hcmsgdGhlIGRpZmZlcmVudCBjb25mbGljdHMgd2UgYXJlIGxvb2tpbmcgYXQgeWVhciAKZD1kYXRhLmZyYW1lKHgxPWMoMTkzOSksIHgyPWMoMTkxOCwgMTk0NSwgMTk5MSwgMTk1MywgMTk3NSwgMjAxMCksIHkxPWMoMCwwLDAsMCwwLDApLCB5Mj1jKC40LC40LC40LC40LC40LC40KSwgQ29uZmxpY3Q9YygiV1dJIiwgIldXSUkiLCAiQ29sZCBXYXIiLCAiS29yZWFuIFdhciIsICJWaWV0bmFtIFdhciIsICJBZmdoYW5pc3RhbiBXYXIiKSwgcj1jKDEsMiwzLDQsNSw2KSkKZ2dwbG90KCkgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZT0ieCIpICsgCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWU9InkiKSArCiAgZ2VvbV9yZWN0KGRhdGE9ZCwgbWFwcGluZz1hZXMoeG1pbj0xOTM5LCB4bWF4PTE5NDUsIHltaW49MCwgeW1heD0uNCksYWxwaGE9MC4xLCBmaWxsID0gInNhbG1vbiIpICsKICBnZW9tX2xpbmUoZGF0YSA9IFdXSUksIGFlcyh4ID0geWVhciwgeSA9IGNpbmMsIGNvbG9yID0gc3RhdGVhYmIsIGdyb3VwID0gc3RhdGVhYmIpKSArIGZhY2V0X3dyYXAofnNpZGUpCgpgYGAKCgpgYGB7ciBmaWcud2lkdGg9MTYsIGZpZy5oZWlnaHQ9MTJ9CgppcnN0PC0gIGdncGxvdCgpICsgCiAgZ2VvbV9yZWN0KGRhdGE9ZCwgbWFwcGluZz1hZXMoeG1pbj1XV0lJX3llYXJfc3QsIHhtYXg9V1dJSV95ZWFyX2VuZCwgeW1pbj0wLCB5bWF4PW1heChXV0lJJGlyc3QpKSxhbHBoYT0wLjEsIGZpbGwgPSAic2FsbW9uIikgKwogIGdlb21fbGluZShkYXRhID0gV1dJSSwgYWVzKHggPSB5ZWFyLCB5ID0gaXJzdCwgY29sb3IgPSBzdGF0ZWFiYiwgZ3JvdXAgPSBzdGF0ZWFiYikpICsgZmFjZXRfd3JhcCh+c2lkZSkKCmV4PC1nZ3Bsb3QoKSArIAogIGdlb21fcmVjdChkYXRhPWQsIG1hcHBpbmc9YWVzKHhtaW49V1dJSV95ZWFyX3N0LCB4bWF4PVdXSUlfeWVhcl9lbmQsIHltaW49MCwgeW1heD1tYXgoV1dJSSRtaWxleCkpLGFscGhhPTAuMSwgZmlsbCA9ICJzYWxtb24iKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBXV0lJLCBhZXMoeCA9IHllYXIsIHkgPSBtaWxleCwgY29sb3IgPSBzdGF0ZWFiYiwgZ3JvdXAgPSBzdGF0ZWFiYikpICsgZmFjZXRfd3JhcCh+c2lkZSkKCnBlcjwtZ2dwbG90KCkgKyAKICBnZW9tX3JlY3QoZGF0YT1kLCBtYXBwaW5nPWFlcyh4bWluPVdXSUlfeWVhcl9zdCwgeG1heD1XV0lJX3llYXJfZW5kLCB5bWluPTAsIHltYXg9bWF4KFdXSUkkbWlscGVyKSksYWxwaGE9MC4xLCBmaWxsID0gInNhbG1vbiIpICsKICBnZW9tX2xpbmUoZGF0YSA9IFdXSUksIGFlcyh4ID0geWVhciwgeSA9IG1pbHBlciwgY29sb3IgPSBzdGF0ZWFiYiwgZ3JvdXAgPSBzdGF0ZWFiYikpICsgZmFjZXRfd3JhcCh+c2lkZSkKCnBlYzwtZ2dwbG90KCkgKyAKICBnZW9tX3JlY3QoZGF0YT1kLCBtYXBwaW5nPWFlcyh4bWluPVdXSUlfeWVhcl9zdCwgeG1heD1XV0lJX3llYXJfZW5kLCB5bWluPTAsIHltYXg9bWF4KFdXSUkkcGVjKSksYWxwaGE9MC4xLCBmaWxsID0gInNhbG1vbiIpICsKICBnZW9tX2xpbmUoZGF0YSA9IFdXSUksIGFlcyh4ID0geWVhciwgeSA9IHBlYywgY29sb3IgPSBzdGF0ZWFiYiwgZ3JvdXAgPSBzdGF0ZWFiYikpICsgZmFjZXRfd3JhcCh+c2lkZSkKCnVwb3A8LWdncGxvdCgpICsgCiAgZ2VvbV9yZWN0KGRhdGE9ZCwgbWFwcGluZz1hZXMoeG1pbj1XV0lJX3llYXJfc3QsIHhtYXg9V1dJSV95ZWFyX2VuZCwgeW1pbj0wLCB5bWF4PW1heChXV0lJJHVwb3ApKSxhbHBoYT0wLjEsIGZpbGwgPSAic2FsbW9uIikgKwogIGdlb21fbGluZShkYXRhID0gV1dJSSwgYWVzKHggPSB5ZWFyLCB5ID0gdXBvcCwgY29sb3IgPSBzdGF0ZWFiYiwgZ3JvdXAgPSBzdGF0ZWFiYikpICsgZmFjZXRfd3JhcCh+c2lkZSkKCnRwb3A8LWdncGxvdCgpICsgCiAgZ2VvbV9yZWN0KGRhdGE9ZCwgbWFwcGluZz1hZXMoeG1pbj1XV0lJX3llYXJfc3QsIHhtYXg9V1dJSV95ZWFyX2VuZCwgeW1pbj0wLCB5bWF4PW1heChXV0lJJHRwb3ApKSxhbHBoYT0wLjEsIGZpbGwgPSAic2FsbW9uIikgKwogIGdlb21fbGluZShkYXRhID0gV1dJSSwgYWVzKHggPSB5ZWFyLCB5ID0gdHBvcCwgY29sb3IgPSBzdGF0ZWFiYiwgZ3JvdXAgPSBzdGF0ZWFiYikpICsgZmFjZXRfd3JhcCh+c2lkZSkKCmdyaWQuYXJyYW5nZShpcnN0LCBleCwgcGVyLCBwZWMsIHRwb3AsIHVwb3AgLCBucm93ID0gMykKYGBgCgoKCgojI0NvbGQgV2FyICgxOTQ3LTE5OTEpCgpbQ29sZCBXYXIgV2lraXBlZGlhXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Db2xkX1dhcikKClRoZSBDb2xkIFdhciB3YXMgYSBzdGF0ZSBvZiBnZW9wb2xpdGljYWwgdGVuc2lvbiBhZnRlciBXb3JsZCBXYXIgSUkgYmV0d2VlbiBwb3dlcnMgaW4gdGhlIEVhc3Rlcm4gQmxvYyAodGhlIFNvdmlldCBVbmlvbiBhbmQgaXRzIHNhdGVsbGl0ZSBzdGF0ZXMpIGFuZCBwb3dlcnMgaW4gdGhlIFdlc3Rlcm4gQmxvYyAodGhlIFVuaXRlZCBTdGF0ZXMsIGl0cyBOQVRPIGFsbGllcyBhbmQgb3RoZXJzKS4gSGlzdG9yaWFucyBkbyBub3QgZnVsbHkgYWdyZWUgb24gdGhlIGRhdGVzLCBidXQgYSBjb21tb24gdGltZWZyYW1lIGlzIHRoZSBwZXJpb2QgYmV0d2VlbiAxOTQ3LCB0aGUgeWVhciB0aGUgVHJ1bWFuIERvY3RyaW5lIChhIFUuUy4gZm9yZWlnbiBwb2xpY3kgcGxlZGdpbmcgdG8gYWlkIG5hdGlvbnMgdGhyZWF0ZW5lZCBieSBTb3ZpZXQgZXhwYW5zaW9uaXNtKSB3YXMgYW5ub3VuY2VkLCBhbmQgMTk5MSwgdGhlIHllYXIgdGhlIFNvdmlldCBVbmlvbiBjb2xsYXBzZWQuCgpUaGUgdGVybSAiY29sZCIgaXMgdXNlZCBiZWNhdXNlIHRoZXJlIHdhcyBubyBsYXJnZS1zY2FsZSBmaWdodGluZyBkaXJlY3RseSBiZXR3ZWVuIHRoZSB0d28gc2lkZXMsIGFsdGhvdWdoIHRoZXJlIHdlcmUgbWFqb3IgcmVnaW9uYWwgd2Fycywga25vd24gYXMgcHJveHkgd2Fycywgc3VwcG9ydGVkIGJ5IHRoZSB0d28gc2lkZXMuIFRoZSBDb2xkIFdhciBzcGxpdCB0aGUgdGVtcG9yYXJ5IHdhcnRpbWUgYWxsaWFuY2UgYWdhaW5zdCBOYXppIEdlcm1hbnksIGxlYXZpbmcgdGhlIFNvdmlldCBVbmlvbiBhbmQgdGhlIFVuaXRlZCBTdGF0ZXMgYXMgdHdvIHN1cGVycG93ZXJzIHdpdGggcHJvZm91bmQgZWNvbm9taWMgYW5kIHBvbGl0aWNhbCBkaWZmZXJlbmNlcy4gCgpBZnRlciB0aGUgZGlzc29sdXRpb24gb2YgdGhlIFNvdmlldCBVbmlvbiwgUnVzc2lhIGRyYXN0aWNhbGx5IGN1dCBtaWxpdGFyeSBzcGVuZGluZywgYW5kIHJlc3RydWN0dXJpbmcgdGhlIGVjb25vbXkgbGVmdCBtaWxsaW9ucyB1bmVtcGxveWVkLlsyODFdIFRoZSBjYXBpdGFsaXN0IHJlZm9ybXMgY3VsbWluYXRlZCBpbiBhIHJlY2Vzc2lvbiBpbiB0aGUgZWFybHkgMTk5MHMgbW9yZSBzZXZlcmUgdGhhbiB0aGUgR3JlYXQgRGVwcmVzc2lvbiBhcyBleHBlcmllbmNlZCBieSB0aGUgVW5pdGVkIFN0YXRlcyBhbmQgR2VybWFueS5bMjgyXQoKVGhlIENvbGQgV2FyIGNvbnRpbnVlcyB0byBpbmZsdWVuY2Ugd29ybGQgYWZmYWlycy4gVGhlIHBvc3QtQ29sZCBXYXIgd29ybGQgaXMgY29uc2lkZXJlZCB0byBiZSB1bmlwb2xhciwgd2l0aCB0aGUgVW5pdGVkIFN0YXRlcyB0aGUgc29sZSByZW1haW5pbmcgc3VwZXJwb3dlci5UaGUgQ29sZCBXYXIgZGVmaW5lZCB0aGUgcG9saXRpY2FsIHJvbGUgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgYWZ0ZXIgV29ybGQgV2FyIElJ4oCUYnkgMTk4OSB0aGUgVW5pdGVkIFN0YXRlcyBoYWQgbWlsaXRhcnkgYWxsaWFuY2VzIHdpdGggNTAgY291bnRyaWVzLCB3aXRoIDUyNiwwMDAgdHJvb3BzIHN0YXRpb25lZCBhYnJvYWQsWzI4Nl0gd2l0aCAzMjYsMDAwIGluIEV1cm9wZSAodHdvLXRoaXJkcyBvZiB3aGljaCBpbiB3ZXN0IEdlcm1hbnkpWzI4N10gYW5kIDEzMCwwMDAgaW4gQXNpYSAobWFpbmx5IEphcGFuIGFuZCBTb3V0aCBLb3JlYSkuWzI4Nl0gVGhlIENvbGQgV2FyIGFsc28gbWFya2VkIHRoZSB6ZW5pdGggb2YgcGVhY2V0aW1lIG1pbGl0YXJ54oCTaW5kdXN0cmlhbCBjb21wbGV4ZXMsIGVzcGVjaWFsbHkgaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIGFuZCBsYXJnZS1zY2FsZSBtaWxpdGFyeSBmdW5kaW5nIG9mIHNjaWVuY2UuWzI4OF0gVGhlc2UgY29tcGxleGVzLCB0aG91Z2ggdGhlaXIgb3JpZ2lucyBtYXkgYmUgZm91bmQgYXMgZWFybHkgYXMgdGhlIDE5dGggY2VudHVyeSwgc25vd2JhbGxlZCBjb25zaWRlcmFibHkgZHVyaW5nIHRoZSBDb2xkIFdhci5bMjg5XQoKYGBge3J9Ck5BVE8gPC0gYygiVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhIiwgIlVuaXRlZCBLaW5nZG9tIiwgIkJlbGdpdW0iLCAiTmV0aGVybGFuZHMiLCAiRnJhbmNlIiwiQ2FuYWRhIiwgIlBvcnR1Z2FsIiwgIkl0YWx5IiwgIk5vcndheSIsICJEZW5tYXJrIiwgIkljZWFsbmQiLCAiVHVya2V5IiwgIkdyZWVjZSIpCm5hdG9fY2NvZGUgIDwtIG1lbWJlcl9hbGxpYW5jZXMkY2NvZGVbbWF0Y2goTkFUTywgbWVtYmVyX2FsbGlhbmNlcyRzdGF0ZV9uYW1lKV0KCndhcnNhdyA8LSBjKCJSdXNzaWEiLCAiQ3plY2hvc2xvdmFraWEiLCAiUm9tYW5pYSIsICJCdWxnYXJpYSIsICJQb2xhbmQiLCAiSHVuZ2FyeSIpCndhcnNhd19jY29kZSAgPC0gbWVtYmVyX2FsbGlhbmNlcyRjY29kZVttYXRjaCh3YXJzYXcsIG1lbWJlcl9hbGxpYW5jZXMkc3RhdGVfbmFtZSldCgoKY3dfeWVhcl9zdCA9IDE5OTEKY3dfeWVhcl9lbmQgPSAxOTQ3CgpjdyA8LSBOTUMKCm5hdG9fbm1jIDwtIGMoIiIpCmZvcihjb2RlIGluIG5hdG9fY2NvZGUgKXsKICBuYXRvX25tYyA8LSByYmluZChuYXRvX25tYywgY3dbY3ckY2NvZGUgPT0gYXMubnVtZXJpYyhjb2RlKSxdKQp9Cm5hdG9fbm1jICA8LSBuYXRvX25tYyBbYygyOm5yb3cobmF0b19ubWMgKSksXQpuYXRvX25tYyRzaWRlID0gIlVTIGFuZCBBbGxpZXMgIgoKd2Fyc2F3X25tYyA8LSBjKCIiKQpmb3IoY29kZSBpbiB3YXJzYXdfY2NvZGUgKXsKICB3YXJzYXdfbm1jIDwtIHJiaW5kKHdhcnNhd19ubWMsIGN3W2N3JGNjb2RlID09IGFzLm51bWVyaWMoY29kZSksXSkKfQp3YXJzYXdfbm1jIDwtIHdhcnNhd19ubWNbYygyOm5yb3cod2Fyc2F3X25tYykpLF0Kd2Fyc2F3X25tYyRzaWRlID0gIlVTU1IgYW5kIEFsbGllcyIKCmN3IDwtcmJpbmQobmF0b19ubWMsd2Fyc2F3X25tYykKY3ckbWlsZXggPC0gYXMubnVtZXJpYyhjdyRtaWxleCkKY3ckbWlscGVyIDwtIGFzLm51bWVyaWMoY3ckbWlscGVyKQpjdyRwZWMgPC0gYXMubnVtZXJpYyhjdyRwZWMpCmN3JHRwb3AgPC0gYXMubnVtZXJpYyhjdyR0cG9wKQpjdyR1cG9wIDwtIGFzLm51bWVyaWMoY3ckdXBvcCkKY3ckY2luYyA8LSBhcy5udW1lcmljKGN3JGNpbmMpCmN3JHllYXIgPC0gYXMubnVtZXJpYyhjdyR5ZWFyKQpjdyRpcnN0IDwtIGFzLm51bWVyaWMoY3ckaXJzdCkKCgpjdyA8LSBjd1tjdyR5ZWFyID49IGN3X3llYXJfc3QtMTAsIF0KCmBgYAoKYGBge3J9CmdncGxvdCgpICsgCiAgZ2VvbV9yZWN0KGRhdGE9ZCwgbWFwcGluZz1hZXMoeG1pbj1jd195ZWFyX3N0LCB4bWF4PWN3X3llYXJfZW5kLCB5bWluPTAsIHltYXg9LjQpLGFscGhhPTAuMSwgZmlsbCA9ICJzYWxtb24iKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBjdywgYWVzKHggPSB5ZWFyLCB5ID0gY2luYywgY29sb3IgPSBzdGF0ZWFiYiwgZ3JvdXAgPSBzdGF0ZWFiYikpICsgZmFjZXRfd3JhcCh+c2lkZSkKCmBgYAoKCmBgYHtyIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD0xMn0KCmlyc3Q8LSAgZ2dwbG90KCkgKyAKICBnZW9tX3JlY3QoZGF0YT1kLCBtYXBwaW5nPWFlcyh4bWluPWN3X3llYXJfc3QsIHhtYXg9Y3dfeWVhcl9lbmQsIHltaW49MCwgeW1heD1tYXgoY3ckaXJzdCkpLGFscGhhPTAuMSwgZmlsbCA9ICJzYWxtb24iKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBjdywgYWVzKHggPSB5ZWFyLCB5ID0gaXJzdCwgY29sb3IgPSBzdGF0ZWFiYiwgZ3JvdXAgPSBzdGF0ZWFiYikpICsgZmFjZXRfd3JhcCh+c2lkZSkKCmV4PC1nZ3Bsb3QoKSArIAogIGdlb21fcmVjdChkYXRhPWQsIG1hcHBpbmc9YWVzKHhtaW49Y3dfeWVhcl9zdCwgeG1heD1jd195ZWFyX2VuZCwgeW1pbj0wLCB5bWF4PW1heChjdyRtaWxleCkpLGFscGhhPTAuMSwgZmlsbCA9ICJzYWxtb24iKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBjdywgYWVzKHggPSB5ZWFyLCB5ID0gbWlsZXgsIGNvbG9yID0gc3RhdGVhYmIsIGdyb3VwID0gc3RhdGVhYmIpKSArIGZhY2V0X3dyYXAofnNpZGUpCgpwZXI8LWdncGxvdCgpICsgCiAgZ2VvbV9yZWN0KGRhdGE9ZCwgbWFwcGluZz1hZXMoeG1pbj1jd195ZWFyX3N0LCB4bWF4PWN3X3llYXJfZW5kLCB5bWluPTAsIHltYXg9bWF4KGN3JG1pbHBlcikpLGFscGhhPTAuMSwgZmlsbCA9ICJzYWxtb24iKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBjdywgYWVzKHggPSB5ZWFyLCB5ID0gbWlscGVyLCBjb2xvciA9IHN0YXRlYWJiLCBncm91cCA9IHN0YXRlYWJiKSkgKyBmYWNldF93cmFwKH5zaWRlKQoKcGVjPC1nZ3Bsb3QoKSArIAogIGdlb21fcmVjdChkYXRhPWQsIG1hcHBpbmc9YWVzKHhtaW49Y3dfeWVhcl9zdCwgeG1heD1jd195ZWFyX2VuZCwgeW1pbj0wLCB5bWF4PW1heChjdyRwZWMpKSxhbHBoYT0wLjEsIGZpbGwgPSAic2FsbW9uIikgKwogIGdlb21fbGluZShkYXRhID0gY3csIGFlcyh4ID0geWVhciwgeSA9IHBlYywgY29sb3IgPSBzdGF0ZWFiYiwgZ3JvdXAgPSBzdGF0ZWFiYikpICsgZmFjZXRfd3JhcCh+c2lkZSkKCnVwb3A8LWdncGxvdCgpICsgCiAgZ2VvbV9yZWN0KGRhdGE9ZCwgbWFwcGluZz1hZXMoeG1pbj1jd195ZWFyX3N0LCB4bWF4PWN3X3llYXJfZW5kLCB5bWluPTAsIHltYXg9bWF4KGN3JHVwb3ApKSxhbHBoYT0wLjEsIGZpbGwgPSAic2FsbW9uIikgKwogIGdlb21fbGluZShkYXRhID0gY3csIGFlcyh4ID0geWVhciwgeSA9IHVwb3AsIGNvbG9yID0gc3RhdGVhYmIsIGdyb3VwID0gc3RhdGVhYmIpKSArIGZhY2V0X3dyYXAofnNpZGUpCgp0cG9wPC1nZ3Bsb3QoKSArIAogIGdlb21fcmVjdChkYXRhPWQsIG1hcHBpbmc9YWVzKHhtaW49Y3dfeWVhcl9zdCwgeG1heD1jd195ZWFyX2VuZCwgeW1pbj0wLCB5bWF4PW1heChjdyR0cG9wKSksYWxwaGE9MC4xLCBmaWxsID0gInNhbG1vbiIpICsKICBnZW9tX2xpbmUoZGF0YSA9IGN3LCBhZXMoeCA9IHllYXIsIHkgPSB0cG9wLCBjb2xvciA9IHN0YXRlYWJiLCBncm91cCA9IHN0YXRlYWJiKSkgKyBmYWNldF93cmFwKH5zaWRlKQoKZ3JpZC5hcnJhbmdlKGlyc3QsIGV4LCBwZXIsIHBlYywgdHBvcCwgdXBvcCAsIG5yb3cgPSAzKQpgYGAKCiMjS29yZWFuIFdhciAoMTk1MC0xOTUzKSAKCk9uZSBvZiB0aGUgbW9yZSBzaWduaWZpY2FudCBpbXBhY3RzIG9mIGNvbnRhaW5tZW50IHdhcyB0aGUgb3V0YnJlYWsgb2YgdGhlIEtvcmVhbiBXYXIuIEluIEp1bmUgMTk1MCwgS2ltIElsLXN1bmcncyBOb3J0aCBLb3JlYW4gUGVvcGxlJ3MgQXJteSBpbnZhZGVkIFNvdXRoIEtvcmVhLls5OV0gSm9zZXBoIFN0YWxpbiAicGxhbm5lZCwgcHJlcGFyZWQsIGFuZCBpbml0aWF0ZWQiIHRoZSBpbnZhc2lvbixbMTAwXSBjcmVhdGluZyAiZGV0YWlsZWQgW3dhcl0gcGxhbnMiIHRoYXQgd2VyZSBjb21tdW5pY2F0ZWQgdG8gdGhlIE5vcnRoIEtvcmVhbnMuVG8gU3RhbGluJ3Mgc3VycHJpc2UsWzE0XSB0aGUgVU4gU2VjdXJpdHkgQ291bmNpbCBiYWNrZWQgdGhlIGRlZmVuc2Ugb2YgU291dGggS29yZWEsIHRob3VnaCB0aGUgU292aWV0cyB3ZXJlIHRoZW4gYm95Y290dGluZyBtZWV0aW5ncyBpbiBwcm90ZXN0IHRoYXQgVGFpd2FuIGFuZCBub3QgQ29tbXVuaXN0IENoaW5hIGhlbGQgYSBwZXJtYW5lbnQgc2VhdCBvbiB0aGUgQ291bmNpbC5bMTA1XSBBIFVOIGZvcmNlIG9mIHBlcnNvbm5lbCBmcm9tIFNvdXRoIEtvcmVhLCB0aGUgVW5pdGVkIFN0YXRlcywgdGhlIFVuaXRlZCBLaW5nZG9tLCBUdXJrZXksIENhbmFkYSwgQ29sb21iaWEsIEF1c3RyYWxpYSwgRnJhbmNlLCBTb3V0aCBBZnJpY2EsIHRoZSBQaGlsaXBwaW5lcywgdGhlIE5ldGhlcmxhbmRzLCBCZWxnaXVtLCBOZXcgWmVhbGFuZCBhbmQgb3RoZXIgY291bnRyaWVzIGpvaW5lZCB0byBzdG9wIHRoZSBpbnZhc2lvbi5bMTA2XQoKCkdlbmVyYWwgRG91Z2xhcyBNYWNBcnRodXIsIFVOIENvbW1hbmQgQ2lDIChzZWF0ZWQpLCBvYnNlcnZlcyB0aGUgbmF2YWwgc2hlbGxpbmcgb2YgSW5jaGVvbiBmcm9tIHRoZSBVU1MgTXQuIE1jS2lubGV5LCBTZXB0ZW1iZXIgMTUsIDE5NTAuCkFtb25nIG90aGVyIGVmZmVjdHMsIHRoZSBLb3JlYW4gV2FyIGdhbHZhbmlzZWQgTkFUTyB0byBkZXZlbG9wIGEgbWlsaXRhcnkgc3RydWN0dXJlLlsxMDddIFB1YmxpYyBvcGluaW9uIGluIGNvdW50cmllcyBpbnZvbHZlZCwgc3VjaCBhcyBHcmVhdCBCcml0YWluLCB3YXMgZGl2aWRlZCBmb3IgYW5kIGFnYWluc3QgdGhlIHdhci4gTWFueSBmZWFyZWQgYW4gZXNjYWxhdGlvbiBpbnRvIGEgZ2VuZXJhbCB3YXIgd2l0aCBDb21tdW5pc3QgQ2hpbmEsIGFuZCBldmVuIG51Y2xlYXIgd2FyLiBUaGUgc3Ryb25nIG9wcG9zaXRpb24gdG8gdGhlIHdhciBvZnRlbiBzdHJhaW5lZCBBbmdsby1BbWVyaWNhbiByZWxhdGlvbnMuIEZvciB0aGVzZSByZWFzb25zIEJyaXRpc2ggb2ZmaWNpYWxzIHNvdWdodCBhIHNwZWVkeSBlbmQgdG8gdGhlIGNvbmZsaWN0LCBob3BpbmcgdG8gdW5pdGUgS29yZWEgdW5kZXIgVW5pdGVkIE5hdGlvbnMgYXVzcGljZXMgYW5kIHdpdGhkcmF3YWwgb2YgYWxsIGZvcmVpZ24gZm9yY2VzLlsxMDhdCgpFdmVuIHRob3VnaCB0aGUgQ2hpbmVzZSBhbmQgTm9ydGggS29yZWFucyB3ZXJlIGV4aGF1c3RlZCBieSB0aGUgd2FyIGFuZCB3ZXJlIHByZXBhcmVkIHRvIGVuZCBpdCBieSBsYXRlIDE5NTIsIFN0YWxpbiBpbnNpc3RlZCB0aGF0IHRoZXkgY29udGludWUgZmlnaHRpbmcsIGFuZCB0aGUgQXJtaXN0aWNlIHdhcyBhcHByb3ZlZCBvbmx5IGluIEp1bHkgMTk1MywgYWZ0ZXIgU3RhbGluJ3MgZGVhdGguWzMwXSBOb3J0aCBLb3JlYW4gbGVhZGVyIEtpbSBJbCBTdW5nIGNyZWF0ZWQgYSBoaWdobHkgY2VudHJhbGl6ZWQsIHRvdGFsaXRhcmlhbiBkaWN0YXRvcnNoaXAg4oCTIHdoaWNoIGNvbnRpbnVlcyB0byBkYXRlIOKAkyBhY2NvcmRpbmcgaGltc2VsZiB1bmxpbWl0ZWQgcG93ZXIgYW5kIGdlbmVyYXRpbmcgYSBmb3JtaWRhYmxlIGN1bHQgb2YgcGVyc29uYWxpdHkuWzEwOV1bMTEwXSBJbiB0aGUgU291dGgsIHRoZSBBbWVyaWNhbi1iYWNrZWQgc3Ryb25nbWFuIFN5bmdtYW4gUmhlZSByYW4gYSBzaWduaWZpY2FudGx5IGxlc3MgYnJ1dGFsIGJ1dCBkZWVwbHkgY29ycnVwdCBhbmQgYXV0aG9yaXRhcmlhbiByZWdpbWUuWzExMV0gQWZ0ZXIgUmhlZSB3YXMgb3ZlcnRocm93biBpbiAxOTYwLCBTb3V0aCBLb3JlYSBmZWxsIHdpdGhpbiBhIHllYXIgdW5kZXIgYSBwZXJpb2Qgb2YgbWlsaXRhcnkgcnVsZSB0aGF0IGxhc3RlZCB1bnRpbCB0aGUgcmUtZXN0YWJsaXNobWVudCBvZiBhIG11bHRpLXBhcnR5IHN5c3RlbSBpbiB0aGUgbGF0ZSAxOTgwcy4KCmBgYHtyfQpzayA8LSBjKCJVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EiLCAiVW5pdGVkIEtpbmdkb20iLCAiU291dGggS29yZWEiKQpza19jY29kZSAgPC0gbWVtYmVyX2FsbGlhbmNlcyRjY29kZVttYXRjaChzaywgbWVtYmVyX2FsbGlhbmNlcyRzdGF0ZV9uYW1lKV0KCgpuayA8LSBjKCJSdXNzaWEiLCAiTm9ydGggS29yZWEiLCAiQ2hpbmEiKQpua19jY29kZSAgPC0gbWVtYmVyX2FsbGlhbmNlcyRjY29kZVttYXRjaChuaywgbWVtYmVyX2FsbGlhbmNlcyRzdGF0ZV9uYW1lKV0KCmt3X3llYXJfc3QgPSAxOTUwCmt3X3llYXJfZW5kID0gMTk1MwoKa3cgPC0gTk1DCgpza19ubWMgPC0gYygiIikKZm9yKGNvZGUgaW4gc2tfY2NvZGUgKXsKICBza19ubWMgPC0gcmJpbmQoc2tfbm1jLCBrd1trdyRjY29kZSA9PSBhcy5udW1lcmljKGNvZGUpLF0pCn0Kc2tfbm1jICA8LSBza19ubWMgW2MoMjpucm93KHNrX25tYyApKSxdCnNrX25tYyRzaWRlID0gIlVTIGFuZCBBbGxpZXMgIgoKbmtfbm1jIDwtIGMoIiIpCmZvcihjb2RlIGluIG5rX2Njb2RlICl7CiAgbmtfbm1jIDwtIHJiaW5kKG5rX25tYywga3dba3ckY2NvZGUgPT0gYXMubnVtZXJpYyhjb2RlKSxdKQp9Cm5rX25tYyA8LSBua19ubWNbYygyOm5yb3cobmtfbm1jKSksXQpua19ubWMkc2lkZSA9ICJVU1NSIGFuZCBBbGxpZXMiCgprdyA8LXJiaW5kKHNrX25tYyxua19ubWMpCgprdyRtaWxleCA8LSBhcy5udW1lcmljKGt3JG1pbGV4KQprdyRtaWxwZXIgPC0gYXMubnVtZXJpYyhrdyRtaWxwZXIpCmt3JHBlYyA8LSBhcy5udW1lcmljKGt3JHBlYykKa3ckdHBvcCA8LSBhcy5udW1lcmljKGt3JHRwb3ApCmt3JHVwb3AgPC0gYXMubnVtZXJpYyhrdyR1cG9wKQprdyRjaW5jIDwtIGFzLm51bWVyaWMoa3ckY2luYykKa3ckeWVhciA8LSBhcy5udW1lcmljKGt3JHllYXIpCmt3JGlyc3QgPC0gYXMubnVtZXJpYyhrdyRpcnN0KQoKa3cgPC0ga3dba3ckeWVhciA+PSBrd195ZWFyX3N0LTUsIF0Ka3cgPC0ga3dba3ckeWVhciA8IGt3X3llYXJfZW5kKzUsIF0KYGBgCmBgYHtyfQpnZ3Bsb3QoKSArIAogIGdlb21fcmVjdChkYXRhPWQsIG1hcHBpbmc9YWVzKHhtaW49a3dfeWVhcl9zdCwgeG1heD1rd195ZWFyX2VuZCwgeW1pbj0wLCB5bWF4PS40KSxhbHBoYT0wLjEsIGZpbGwgPSAic2FsbW9uIikgKwogIGdlb21fbGluZShkYXRhID0ga3csIGFlcyh4ID0geWVhciwgeSA9IGNpbmMsIGNvbG9yID0gc3RhdGVhYmIsIGdyb3VwID0gc3RhdGVhYmIpKSArIGZhY2V0X3dyYXAofnNpZGUpCgpgYGAKCgpgYGB7ciBmaWcud2lkdGg9MTYsIGZpZy5oZWlnaHQ9MTJ9CgppcnN0PC0gIGdncGxvdCgpICsgCiAgZ2VvbV9yZWN0KGRhdGE9ZCwgbWFwcGluZz1hZXMoeG1pbj1rd195ZWFyX3N0LCB4bWF4PWt3X3llYXJfZW5kLCB5bWluPTAsIHltYXg9bWF4KGt3JGlyc3QpKSxhbHBoYT0wLjEsIGZpbGwgPSAic2FsbW9uIikgKwogIGdlb21fbGluZShkYXRhID0ga3csIGFlcyh4ID0geWVhciwgeSA9IGlyc3QsIGNvbG9yID0gc3RhdGVhYmIsIGdyb3VwID0gc3RhdGVhYmIpKSArIGZhY2V0X3dyYXAofnNpZGUpCgpleDwtZ2dwbG90KCkgKyAKICBnZW9tX3JlY3QoZGF0YT1kLCBtYXBwaW5nPWFlcyh4bWluPWt3X3llYXJfc3QsIHhtYXg9a3dfeWVhcl9lbmQsIHltaW49MCwgeW1heD1tYXgoa3ckbWlsZXgpKSxhbHBoYT0wLjEsIGZpbGwgPSAic2FsbW9uIikgKwogIGdlb21fbGluZShkYXRhID0ga3csIGFlcyh4ID0geWVhciwgeSA9IG1pbGV4LCBjb2xvciA9IHN0YXRlYWJiLCBncm91cCA9IHN0YXRlYWJiKSkgKyBmYWNldF93cmFwKH5zaWRlKQoKcGVyPC1nZ3Bsb3QoKSArIAogIGdlb21fcmVjdChkYXRhPWQsIG1hcHBpbmc9YWVzKHhtaW49a3dfeWVhcl9zdCwgeG1heD1rd195ZWFyX2VuZCwgeW1pbj0wLCB5bWF4PW1heChrdyRtaWxwZXIpKSxhbHBoYT0wLjEsIGZpbGwgPSAic2FsbW9uIikgKwogIGdlb21fbGluZShkYXRhID0ga3csIGFlcyh4ID0geWVhciwgeSA9IG1pbHBlciwgY29sb3IgPSBzdGF0ZWFiYiwgZ3JvdXAgPSBzdGF0ZWFiYikpICsgZmFjZXRfd3JhcCh+c2lkZSkKCnBlYzwtZ2dwbG90KCkgKyAKICBnZW9tX3JlY3QoZGF0YT1kLCBtYXBwaW5nPWFlcyh4bWluPWt3X3llYXJfc3QsIHhtYXg9a3dfeWVhcl9lbmQsIHltaW49MCwgeW1heD1tYXgoa3ckcGVjKSksYWxwaGE9MC4xLCBmaWxsID0gInNhbG1vbiIpICsKICBnZW9tX2xpbmUoZGF0YSA9IGt3LCBhZXMoeCA9IHllYXIsIHkgPSBwZWMsIGNvbG9yID0gc3RhdGVhYmIsIGdyb3VwID0gc3RhdGVhYmIpKSArIGZhY2V0X3dyYXAofnNpZGUpCgp1cG9wPC1nZ3Bsb3QoKSArIAogIGdlb21fcmVjdChkYXRhPWQsIG1hcHBpbmc9YWVzKHhtaW49a3dfeWVhcl9zdCwgeG1heD1rd195ZWFyX2VuZCwgeW1pbj0wLCB5bWF4PW1heChrdyR1cG9wKSksYWxwaGE9MC4xLCBmaWxsID0gInNhbG1vbiIpICsKICBnZW9tX2xpbmUoZGF0YSA9IGt3LCBhZXMoeCA9IHllYXIsIHkgPSB1cG9wLCBjb2xvciA9IHN0YXRlYWJiLCBncm91cCA9IHN0YXRlYWJiKSkgKyBmYWNldF93cmFwKH5zaWRlKQoKdHBvcDwtZ2dwbG90KCkgKyAKICBnZW9tX3JlY3QoZGF0YT1kLCBtYXBwaW5nPWFlcyh4bWluPWt3X3llYXJfc3QsIHhtYXg9a3dfeWVhcl9lbmQsIHltaW49MCwgeW1heD1tYXgoa3ckdHBvcCkpLGFscGhhPTAuMSwgZmlsbCA9ICJzYWxtb24iKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBrdywgYWVzKHggPSB5ZWFyLCB5ID0gdHBvcCwgY29sb3IgPSBzdGF0ZWFiYiwgZ3JvdXAgPSBzdGF0ZWFiYikpICsgZmFjZXRfd3JhcCh+c2lkZSkKCmdyaWQuYXJyYW5nZShpcnN0LCBleCwgcGVyLCBwZWMsIHRwb3AsIHVwb3AgLCBucm93ID0gMykKYGBgCgojI1ZpZXRuYW0gV2FyICgxOTU1LTE5NzUpICAKCmBgYHtyfQp1cyA8LSBjKCJVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EiLCAiU291dGggS29yZWEiLCAiQ2hpbmEiLCAiTmV3IFplYWxhbmQiLCAiQXVzdHJhbGlhIikKdXNfY2NvZGUgIDwtIG1lbWJlcl9hbGxpYW5jZXMkY2NvZGVbbWF0Y2godXMsIG1lbWJlcl9hbGxpYW5jZXMkc3RhdGVfbmFtZSldCgoKdmlldCA8LSBjKCJSdXNzaWEiLCAiTm9ydGggS29yZWEiLCAiVmlldG5hbSIsICJDdWJhIikKdmlldF9jY29kZSAgPC0gbWVtYmVyX2FsbGlhbmNlcyRjY29kZVttYXRjaCh2aWV0LCBtZW1iZXJfYWxsaWFuY2VzJHN0YXRlX25hbWUpXQoKdndfeWVhcl9zdCA9IDE5NTUKdndfeWVhcl9lbmQgPSAxOTc1Cgp2dyA8LSBOTUMKCnVzX25tYyA8LSBjKCIiKQpmb3IoY29kZSBpbiB1c19jY29kZSApewogIHVzX25tYyA8LSByYmluZCh1c19ubWMsIHZ3W3Z3JGNjb2RlID09IGFzLm51bWVyaWMoY29kZSksXSkKfQp1c19ubWMgIDwtIHVzX25tYyBbYygyOm5yb3codXNfbm1jICkpLF0KdXNfbm1jJHNpZGUgPSAiVVMgYW5kIEFsbGllcyAiCgp2aWV0X25tYyA8LSBjKCIiKQpmb3IoY29kZSBpbiB2aWV0X2Njb2RlICl7CiAgdmlldF9ubWMgPC0gcmJpbmQodmlldF9ubWMsIHZ3W3Z3JGNjb2RlID09IGFzLm51bWVyaWMoY29kZSksXSkKfQp2aWV0X25tYyA8LSB2aWV0X25tY1tjKDI6bnJvdyh2aWV0X25tYykpLF0KdmlldF9ubWMkc2lkZSA9ICJWaWV0bmFtIGFuZCBBbGxpZXMiCgp2dyA8LXJiaW5kKHVzX25tYyx2aWV0X25tYykKCnZ3JG1pbGV4IDwtIGFzLm51bWVyaWModnckbWlsZXgpCnZ3JG1pbHBlciA8LSBhcy5udW1lcmljKHZ3JG1pbHBlcikKdnckcGVjIDwtIGFzLm51bWVyaWModnckcGVjKQp2dyR0cG9wIDwtIGFzLm51bWVyaWModnckdHBvcCkKdnckdXBvcCA8LSBhcy5udW1lcmljKHZ3JHVwb3ApCnZ3JGNpbmMgPC0gYXMubnVtZXJpYyh2dyRjaW5jKQp2dyR5ZWFyIDwtIGFzLm51bWVyaWModnckeWVhcikKdnckaXJzdCA8LSBhcy5udW1lcmljKHZ3JGlyc3QpCgp2dyA8LSB2d1t2dyR5ZWFyID49IHZ3X3llYXJfc3QtNSwgXQp2dyA8LSB2d1t2dyR5ZWFyIDwgdndfeWVhcl9lbmQrNSwgXQoKYGBgCgoKYGBge3J9CmdncGxvdCgpICsgCiAgZ2VvbV9yZWN0KGRhdGE9ZCwgbWFwcGluZz1hZXMoeG1pbj12d195ZWFyX3N0LCB4bWF4PXZ3X3llYXJfZW5kLCB5bWluPTAsIHltYXg9LjQpLGFscGhhPTAuMSwgZmlsbCA9ICJzYWxtb24iKSArCiAgZ2VvbV9saW5lKGRhdGEgPSB2dywgYWVzKHggPSB5ZWFyLCB5ID0gY2luYywgY29sb3IgPSBzdGF0ZWFiYiwgZ3JvdXAgPSBzdGF0ZWFiYikpICsgZmFjZXRfd3JhcCh+c2lkZSkKCmBgYAoKCgoKYGBge3IgZmlnLndpZHRoPTE2LCBmaWcuaGVpZ2h0PTEyfQppcnN0PC0gIGdncGxvdCgpICsgCiAgZ2VvbV9yZWN0KGRhdGE9ZCwgbWFwcGluZz1hZXMoeG1pbj12d195ZWFyX3N0LCB4bWF4PXZ3X3llYXJfZW5kLCB5bWluPTAsIHltYXg9bWF4KHZ3JGlyc3QpKSxhbHBoYT0wLjEsIGZpbGwgPSAic2FsbW9uIikgKwogIGdlb21fbGluZShkYXRhID0gdncsIGFlcyh4ID0geWVhciwgeSA9IGlyc3QsIGNvbG9yID0gc3RhdGVhYmIsIGdyb3VwID0gc3RhdGVhYmIpKSArIGZhY2V0X3dyYXAofnNpZGUpCgpleDwtZ2dwbG90KCkgKyAKICBnZW9tX3JlY3QoZGF0YT1kLCBtYXBwaW5nPWFlcyh4bWluPXZ3X3llYXJfc3QsIHhtYXg9dndfeWVhcl9lbmQsIHltaW49MCwgeW1heD1tYXgodnckbWlsZXgpKSxhbHBoYT0wLjEsIGZpbGwgPSAic2FsbW9uIikgKwogIGdlb21fbGluZShkYXRhID0gdncsIGFlcyh4ID0geWVhciwgeSA9IG1pbGV4LCBjb2xvciA9IHN0YXRlYWJiLCBncm91cCA9IHN0YXRlYWJiKSkgKyBmYWNldF93cmFwKH5zaWRlKQoKcGVyPC1nZ3Bsb3QoKSArIAogIGdlb21fcmVjdChkYXRhPWQsIG1hcHBpbmc9YWVzKHhtaW49dndfeWVhcl9zdCwgeG1heD12d195ZWFyX2VuZCwgeW1pbj0wLCB5bWF4PW1heCh2dyRtaWxwZXIpKSxhbHBoYT0wLjEsIGZpbGwgPSAic2FsbW9uIikgKwogIGdlb21fbGluZShkYXRhID0gdncsIGFlcyh4ID0geWVhciwgeSA9IG1pbHBlciwgY29sb3IgPSBzdGF0ZWFiYiwgZ3JvdXAgPSBzdGF0ZWFiYikpICsgZmFjZXRfd3JhcCh+c2lkZSkKCnBlYzwtZ2dwbG90KCkgKyAKICBnZW9tX3JlY3QoZGF0YT1kLCBtYXBwaW5nPWFlcyh4bWluPXZ3X3llYXJfc3QsIHhtYXg9dndfeWVhcl9lbmQsIHltaW49MCwgeW1heD1tYXgodnckcGVjKSksYWxwaGE9MC4xLCBmaWxsID0gInNhbG1vbiIpICsKICBnZW9tX2xpbmUoZGF0YSA9IHZ3LCBhZXMoeCA9IHllYXIsIHkgPSBwZWMsIGNvbG9yID0gc3RhdGVhYmIsIGdyb3VwID0gc3RhdGVhYmIpKSArIGZhY2V0X3dyYXAofnNpZGUpCgp1cG9wPC1nZ3Bsb3QoKSArIAogIGdlb21fcmVjdChkYXRhPWQsIG1hcHBpbmc9YWVzKHhtaW49dndfeWVhcl9zdCwgeG1heD12d195ZWFyX2VuZCwgeW1pbj0wLCB5bWF4PW1heCh2dyR1cG9wKSksYWxwaGE9MC4xLCBmaWxsID0gInNhbG1vbiIpICsKICBnZW9tX2xpbmUoZGF0YSA9IHZ3LCBhZXMoeCA9IHllYXIsIHkgPSB1cG9wLCBjb2xvciA9IHN0YXRlYWJiLCBncm91cCA9IHN0YXRlYWJiKSkgKyBmYWNldF93cmFwKH5zaWRlKQoKdHBvcDwtZ2dwbG90KCkgKyAKICBnZW9tX3JlY3QoZGF0YT1kLCBtYXBwaW5nPWFlcyh4bWluPXZ3X3llYXJfc3QsIHhtYXg9dndfeWVhcl9lbmQsIHltaW49MCwgeW1heD1tYXgodnckdHBvcCkpLGFscGhhPTAuMSwgZmlsbCA9ICJzYWxtb24iKSArCiAgZ2VvbV9saW5lKGRhdGEgPSB2dywgYWVzKHggPSB5ZWFyLCB5ID0gdHBvcCwgY29sb3IgPSBzdGF0ZWFiYiwgZ3JvdXAgPSBzdGF0ZWFiYikpICsgZmFjZXRfd3JhcCh+c2lkZSkKCmdyaWQuYXJyYW5nZShpcnN0LCBleCwgcGVyLCBwZWMsIHRwb3AsIHVwb3AgLCBucm93ID0gMykKYGBgCgojI1dhciBpbiBBZmdoYW5pc3RhbiAoMjAwMS0yMDEwKSAgCgoKVGhlIHdhciBpbiBBZmdoYW5pc3RhbiAob3IgdGhlIEFtZXJpY2FuIHdhciBpbiBBZmdoYW5pc3RhbikgZm9sbG93ZWQgdGhlIDIwMDEgVW5pdGVkIFN0YXRlcyBpbnZhc2lvbiBvZiBBZmdoYW5pc3Rhbi5TdXBwb3J0ZWQgaW5pdGlhbGx5IGJ5IHRoZSBVbml0ZWQgS2luZ2RvbSwgdGhlIFVTIHdhcyBsYXRlciBqb2luZWQgYnkgdGhlIHJlc3Qgb2YgTkFUTywgYmVnaW5uaW5nIGluIDIwMDMuIEl0cyBwdWJsaWMgYWltcyB3ZXJlIHRvIGRpc21hbnRsZSBhbC1RYWVkYSBhbmQgdG8gZGVueSBpdCBhIHNhZmUgYmFzZSBvZiBvcGVyYXRpb25zIGluIEFmZ2hhbmlzdGFuIGJ5IHJlbW92aW5nIHRoZSBUYWxpYmFuIGZyb20gcG93ZXIuWzMyXSBLZXkgYWxsaWVzLCBpbmNsdWRpbmcgdGhlIFVuaXRlZCBLaW5nZG9tLCBzdXBwb3J0ZWQgdGhlIFUuUy4gZnJvbSB0aGUgc3RhcnQgdG8gdGhlIGVuZCBvZiB0aGUgcGhhc2UuIFRoaXMgcGhhc2Ugb2YgdGhlIHdhciBpcyB0aGUgbG9uZ2VzdCB3YXIgaW4gVW5pdGVkIFN0YXRlcyBoaXN0b3J5LgoKClJlc3VsdDogIAoJCiogRGVzdHJ1Y3Rpb24gb2YgYWwtUWFlZGEgYW5kIFRhbGliYW4gbWlsaXRhbnQgdHJhaW5pbmcgY2FtcHMgIAoqIEZhbGwgb2YgdGhlIFRhbGliYW4gZ292ZXJubWVudCAgCiogRXN0YWJsaXNobWVudCBvZiB0aGUgSXNsYW1pYyBSZXB1YmxpYyBvZiBBZmdoYW5pc3RhbiB1bmRlciB0aGUgS2FyemFpIGFkbWluaXN0cmF0aW9uICAKKiBTdGFydCBvZiBUYWxpYmFuIGluc3VyZ2VuY3kgIAoqIERlYXRoIG9mIE9zYW1hIGJpbiBMYWRlbiAgCiogQ29tbWVuY2VtZW50IG9mIHdhcidzIDIwMTXigJNwcmVzZW50IHBoYXNlICAKIApgYGB7cn0KdXMgPC0gYygiVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhIiwgIlVuaXRlZCBLaW5nZG9tIiwgIkNhbmFkYSIsICJHZXJtYW55IiwgIkF1c3RyYWxpYSIpCnVzX2Njb2RlICA8LSBtZW1iZXJfYWxsaWFuY2VzJGNjb2RlW21hdGNoKHVzLCBtZW1iZXJfYWxsaWFuY2VzJHN0YXRlX25hbWUpXQoKCmFmZyA8LSBjKCJBZmdoYW5pc3RhbiIpCmFmZ19jY29kZSAgPC0gbWVtYmVyX2FsbGlhbmNlcyRjY29kZVttYXRjaChhZmcsIG1lbWJlcl9hbGxpYW5jZXMkc3RhdGVfbmFtZSldCgphd195ZWFyX3N0ID0gMjAwMQphd195ZWFyX2VuZCA9IDIwMTAKCmF3IDwtIE5NQwoKdXNfbm1jIDwtIGMoIiIpCmZvcihjb2RlIGluIHVzX2Njb2RlICl7CiAgdXNfbm1jIDwtIHJiaW5kKHVzX25tYywgYXdbYXckY2NvZGUgPT0gYXMubnVtZXJpYyhjb2RlKSxdKQp9CnVzX25tYyAgPC0gdXNfbm1jIFtjKDI6bnJvdyh1c19ubWMgKSksXQp1c19ubWMkc2lkZSA9ICJVUyBhbmQgVU4iCgphZmdfbm1jIDwtIGMoIiIpCmZvcihjb2RlIGluIGFmZ19jY29kZSApewogIGFmZ19ubWMgPC0gcmJpbmQoYWZnX25tYywgYXdbYXckY2NvZGUgPT0gYXMubnVtZXJpYyhjb2RlKSxdKQp9CmFmZ19ubWMgPC0gYWZnX25tY1tjKDI6bnJvdyhhZmdfbm1jKSksXQphZmdfbm1jJHNpZGUgPSAiQWZnaGFuaXN0YW4iCgphdyA8LXJiaW5kKHVzX25tYyxhZmdfbm1jKQoKYXckbWlsZXggPC0gYXMubnVtZXJpYyhhdyRtaWxleCkKYXckbWlscGVyIDwtIGFzLm51bWVyaWMoYXckbWlscGVyKQphdyRwZWMgPC0gYXMubnVtZXJpYyhhdyRwZWMpCmF3JHRwb3AgPC0gYXMubnVtZXJpYyhhdyR0cG9wKQphdyR1cG9wIDwtIGFzLm51bWVyaWMoYXckdXBvcCkKYXckY2luYyA8LSBhcy5udW1lcmljKGF3JGNpbmMpCmF3JHllYXIgPC0gYXMubnVtZXJpYyhhdyR5ZWFyKQphdyRpcnN0IDwtIGFzLm51bWVyaWMoYXckaXJzdCkKCmF3IDwtIGF3W2F3JHllYXIgPj0gYXdfeWVhcl9zdC0xMCwgXQoKYGBgCgpgYGB7cn0KZ2dwbG90KCkgKyAKICBnZW9tX3JlY3QoZGF0YT1kLCBtYXBwaW5nPWFlcyh4bWluPWF3X3llYXJfc3QsIHhtYXg9YXdfeWVhcl9lbmQsIHltaW49MCwgeW1heD0uNCksYWxwaGE9MC4xLCBmaWxsID0gInNhbG1vbiIpICsKICBnZW9tX2xpbmUoZGF0YSA9IGF3LCBhZXMoeCA9IHllYXIsIHkgPSBjaW5jLCBjb2xvciA9IHN0YXRlYWJiLCBncm91cCA9IHN0YXRlYWJiKSkgKyBmYWNldF93cmFwKH5zaWRlKQoKYGBgCmBgYHtyIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD0xMn0KaXJzdDwtICBnZ3Bsb3QoKSArIAogIGdlb21fcmVjdChkYXRhPWQsIG1hcHBpbmc9YWVzKHhtaW49YXdfeWVhcl9zdCwgeG1heD1hd195ZWFyX2VuZCwgeW1pbj0wLCB5bWF4PW1heChhdyRpcnN0KSksYWxwaGE9MC4xLCBmaWxsID0gInNhbG1vbiIpICsKICBnZW9tX2xpbmUoZGF0YSA9IGF3LCBhZXMoeCA9IHllYXIsIHkgPSBpcnN0LCBjb2xvciA9IHN0YXRlYWJiLCBncm91cCA9IHN0YXRlYWJiKSkgKyBmYWNldF93cmFwKH5zaWRlKQoKZXg8LWdncGxvdCgpICsgCiAgZ2VvbV9yZWN0KGRhdGE9ZCwgbWFwcGluZz1hZXMoeG1pbj1hd195ZWFyX3N0LCB4bWF4PWF3X3llYXJfZW5kLCB5bWluPTAsIHltYXg9bWF4KGF3JG1pbGV4KSksYWxwaGE9MC4xLCBmaWxsID0gInNhbG1vbiIpICsKICBnZW9tX2xpbmUoZGF0YSA9IGF3LCBhZXMoeCA9IHllYXIsIHkgPSBtaWxleCwgY29sb3IgPSBzdGF0ZWFiYiwgZ3JvdXAgPSBzdGF0ZWFiYikpICsgZmFjZXRfd3JhcCh+c2lkZSkKCnBlcjwtZ2dwbG90KCkgKyAKICBnZW9tX3JlY3QoZGF0YT1kLCBtYXBwaW5nPWFlcyh4bWluPWF3X3llYXJfc3QsIHhtYXg9YXdfeWVhcl9lbmQsIHltaW49MCwgeW1heD1tYXgoYXckbWlscGVyKSksYWxwaGE9MC4xLCBmaWxsID0gInNhbG1vbiIpICsKICBnZW9tX2xpbmUoZGF0YSA9IGF3LCBhZXMoeCA9IHllYXIsIHkgPSBtaWxwZXIsIGNvbG9yID0gc3RhdGVhYmIsIGdyb3VwID0gc3RhdGVhYmIpKSArIGZhY2V0X3dyYXAofnNpZGUpCgpwZWM8LWdncGxvdCgpICsgCiAgZ2VvbV9yZWN0KGRhdGE9ZCwgbWFwcGluZz1hZXMoeG1pbj1hd195ZWFyX3N0LCB4bWF4PWF3X3llYXJfZW5kLCB5bWluPTAsIHltYXg9bWF4KGF3JHBlYykpLGFscGhhPTAuMSwgZmlsbCA9ICJzYWxtb24iKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBhdywgYWVzKHggPSB5ZWFyLCB5ID0gcGVjLCBjb2xvciA9IHN0YXRlYWJiLCBncm91cCA9IHN0YXRlYWJiKSkgKyBmYWNldF93cmFwKH5zaWRlKQoKdXBvcDwtZ2dwbG90KCkgKyAKICBnZW9tX3JlY3QoZGF0YT1kLCBtYXBwaW5nPWFlcyh4bWluPWF3X3llYXJfc3QsIHhtYXg9YXdfeWVhcl9lbmQsIHltaW49MCwgeW1heD1tYXgoYXckdXBvcCkpLGFscGhhPTAuMSwgZmlsbCA9ICJzYWxtb24iKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBhdywgYWVzKHggPSB5ZWFyLCB5ID0gdXBvcCwgY29sb3IgPSBzdGF0ZWFiYiwgZ3JvdXAgPSBzdGF0ZWFiYikpICsgZmFjZXRfd3JhcCh+c2lkZSkKCnRwb3A8LWdncGxvdCgpICsgCiAgZ2VvbV9yZWN0KGRhdGE9ZCwgbWFwcGluZz1hZXMoeG1pbj1hd195ZWFyX3N0LCB4bWF4PWF3X3llYXJfZW5kLCB5bWluPTAsIHltYXg9bWF4KGF3JHRwb3ApKSxhbHBoYT0wLjEsIGZpbGwgPSAic2FsbW9uIikgKwogIGdlb21fbGluZShkYXRhID0gYXcsIGFlcyh4ID0geWVhciwgeSA9IHRwb3AsIGNvbG9yID0gc3RhdGVhYmIsIGdyb3VwID0gc3RhdGVhYmIpKSArIGZhY2V0X3dyYXAofnNpZGUpCgpncmlkLmFycmFuZ2UoaXJzdCwgZXgsIHBlciwgcGVjLCB0cG9wLCB1cG9wICwgbnJvdyA9IDMpCmBgYAoKCgpgYGB7ciBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD0zfQoKIyMgbG9va2luZyBhdCByYXRpb3MgCgpubWNfYzIgPC1ubWNfYwoKI25tY19jMiRpcnN0IDwtIG5tY19jMiRpcnN0L21heChubWNfYzIkaXJzdCkKI25tY19jMiRtaWxleCA8LSBubWNfYzIkbWlsZXgvbWF4KG5tY19jMiRtaWxleCkKI25tY19jMiRtaWxwZXIgPC0gbm1jX2MyJG1pbHBlci9tYXgobm1jX2MyJG1pbHBlcikKI25tY19jMiRwZWMgPC0gbm1jX2MyJHBlYy9tYXgobm1jX2MyJHBlYykKI25tY19jMiR0cG9wIDwtIG5tY19jMiR0cG9wL21heChubWNfYzIkdHBvcCkKI25tY19jMiR1cG9wIDwtIG5tY19jMiR1cG9wL21heChubWNfYzIkdXBvcCkKCm5tY19jMzwtIGdhdGhlcihubWNfYzIsIG1ldHJpYywgdmFsdWUsIGlyc3Q6dXBvcCkKCmdncGxvdCgpICsgCmdlb21fcmVjdChkYXRhPWQsIG1hcHBpbmc9YWVzKHhtaW4gPSB4MSwgeG1heD14MiwgeW1pbj0wLCB5bWF4PTEsIGZpbGwgPSBDb25mbGljdCApLGFscGhhPTAuMjUpICsKZ2VvbV9saW5lKGRhdGEgPSBubWNfYzMsIGFlcyh4ID0geWVhciwgeSA9IHZhbHVlLCBjb2xvciA9IHN0YXRlYWJiKSwgYWxwaGEgPSAxKSArIGZhY2V0X3dyYXAofm1ldHJpYykKCmBgYAoKCgojIyBDYWxjdWxhdGUgUmF0aW9zCmBgYHtyfQoKTk1DID0gcmVhZC5jc3YocGFzdGUocGF0aCwgIk5NQy9OTUNfdjRfMC5jc3YiLCBzZXA9ICIvIikpCgpOTUMkY2luY1tOTUMkY2luYyA9PSAtOV0gPC0gMApOTUMkaXJzdFtOTUMkaXJzdCA9PSAtOV0gPC0gMApOTUMkbWlsZXhbTk1DJG1pbGV4ID09IC05XSA8LSAwCk5NQyRtaWxwZXJbTk1DJG1pbHBlcj09IC05XSA8LSAwCk5NQyRwZWNbTk1DJHBlYyA9PSAtOV0gPC0gMApOTUMkdHBvcFtOTUMkdHBvcCA9PSAtOV0gPC0gMApOTUMkdXBvcFtOTUMkdXBvcCA9PSAtOV0gPC0gMAoKCgpnZ3Bsb3QoTk1DW05NQyR5ZWFyID4gMTkwMCxdLCBhZXMoc3RhdGVhYmIsIHllYXIsIGZpbGwgPSBjaW5jKSkgKyBnZW9tX3RpbGUoKSsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArIGdndGl0bGUoIkhlYXRtYXAgb2YgY2luYyIpICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2MCwgaGp1c3QgPSAxKSxwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkKCgojY29tcGxldGUgY2FzZXMKY29tcGxldGUuY2FzZXMoTk1DX29yaWcpCgpgYGAKCgpgYGB7cn0KCmFsbF95ZWFyIDwtIGMoMTkwMDoyMDA3KQoKTk1DJGNpbmNbTk1DJGNpbmMgPT0gLTl8IGlzLm5hKE5NQyRjaW5jKV0gPC0gMApOTUMkaXJzdFtOTUMkaXJzdCA9PSAtOXwgaXMubmEoTk1DJGlyc3QpXSA8LSAwCk5NQyRtaWxleFtOTUMkbWlsZXggPT0gLTl8IGlzLm5hKE5NQyRtaWxleCldIDwtIDAKTk1DJG1pbHBlcltOTUMkbWlscGVyPT0gLTl8IGlzLm5hKE5NQyRtaWxwZXIpXSA8LSAwCk5NQyRwZWNbTk1DJHBlYyA9PSAtOXwgaXMubmEoTk1DJHBlYyldIDwtIDAKTk1DJHRwb3BbTk1DJHRwb3AgPT0gLTl8IGlzLm5hKE5NQyR0cG9wKV0gPC0gMApOTUMkdXBvcFtOTUMkdXBvcCA9PSAtOXwgaXMubmEoTk1DJHVwb3ApXSA8LSAwCgpOTUMkaXJzdCA8LSBhcy5udW1lcmljKE5NQyRpcnN0KQpOTUMkbWlsZXggPC0gYXMubnVtZXJpYyhOTUMkbWlsZXgpCk5NQyRtaWxwZXIgPC0gYXMubnVtZXJpYyhOTUMkbWlscGVyKQpOTUMkcGVjIDwtIGFzLm51bWVyaWMoTk1DJHBlYykKTk1DJHRwb3AgPC0gYXMubnVtZXJpYyhOTUMkdHBvcCkKTk1DJHVwb3AgPC0gYXMubnVtZXJpYyhOTUMkdXBvcCkKTk1DJGNpbmMgPC0gYXMubnVtZXJpYyhOTUMkY2luYykKTk1DJHllYXIgPC0gYXMubnVtZXJpYyhOTUMkeWVhcikKCgp5cjIwMDAgPC0gTk1DW05NQyR5ZWFyID09IDE5NzEsIF0gCmFwcGx5KHlyMjAwMCwgMiwgbWF4KQoKTk1DMiA8LSBjKCIiKQoKZm9yICh5ZWFyX3QgaW4gYWxsX3llYXIpewogIHlyIDwtIE5NQ1tOTUMkeWVhciA9PSB5ZWFyX3QsIF0gCiAgCiAgbWF4IDwtIGFwcGx5KHlyLCAyLCBtYXgpCiAgbWF4IDwtIGFzLm51bWVyaWMobWF4WzQ6OV0pCiAgCiAgZm9yIChpIGluIDQ6OSl7CiAgICB5clssaV0gPSB5clssaV0vbWF4W2ktM10KCiAgfQogIE5NQzIgPC0gcmJpbmQoTk1DMiwgeXIpCn0KCk5NQzIgPC0gTk1DMltjKDI6bnJvdyhOTUMyKSksXQoKCmBgYAoKYGBge3IgZmlnLndpZHRoPTIwLCBmaWcuaGVpZ2h0PTE1fQpkPWRhdGEuZnJhbWUoeDE9YygxOTE0LDE5MzksIDE5NDcsIDE5NTAsIDE5NTUsIDIwMDEpLCB4Mj1jKDE5MTgsIDE5NDUsIDE5OTEsIDE5NTMsIDE5NzUsIDIwMTApLCB5MT1jKDAsMCwwLDAsMCwwKSwgeTI9YyguNCwuNCwuNCwuNCwuNCwuNCksIENvbmZsaWN0PWMoIldXSSIsICJXV0lJIiwgIkNvbGQgV2FyIiwgIktvcmVhbiBXYXIiLCAiVmlldG5hbSBXYXIiLCAiQWZnaGFuaXN0YW4gV2FyIiksIHI9YygxLDIsMyw0LDUsNikpCk5NQzJfeXI8LSBOTUMyW05NQzIkeWVhciA+IDE5MDAsXQoKY291bnRyaWVzIDwtIGMoIlVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYSIsICJVbml0ZWQgS2luZ2RvbSIsICJGcmFuY2UiLCAiUnVzc2lhIiwiR2VybWFueSIsICJJdGFseSIsICJKYXBhbiIsICJDaGluYSIpCmNvdW50cnlfY29kZSA8LSBtZW1iZXJfYWxsaWFuY2VzJGNjb2RlW21hdGNoKGNvdW50cmllcywgbWVtYmVyX2FsbGlhbmNlcyRzdGF0ZV9uYW1lKV0KCgpOTUMyX3lyIDwtIGZpbHRlcihOTUMyX3lyLCBOTUMyX3lyJGNjb2RlICVpbiUgY291bnRyeV9jb2RlICkKTk1DX29yaWdfeXIgPC0gZmlsdGVyKE5NQywgTk1DJGNjb2RlICVpbiUgY291bnRyeV9jb2RlICkKCk5NQzJfeXIkaXJzdCA8LSBhcy5udW1lcmljKE5NQzJfeXIkaXJzdCkKTk1DMl95ciRtaWxleCA8LSBhcy5udW1lcmljKE5NQzJfeXIkbWlsZXgpCk5NQzJfeXIkbWlscGVyIDwtIGFzLm51bWVyaWMoTk1DMl95ciRtaWxwZXIpCk5NQzJfeXIkcGVjIDwtIGFzLm51bWVyaWMoTk1DMl95ciRwZWMpCk5NQzJfeXIkdHBvcCA8LSBhcy5udW1lcmljKE5NQzJfeXIkdHBvcCkKTk1DMl95ciR1cG9wIDwtIGFzLm51bWVyaWMoTk1DMl95ciR1cG9wKQpOTUMyX3lyJGNpbmMgPC0gYXMubnVtZXJpYyhOTUMyX3lyJGNpbmMpCk5NQzJfeXIkeWVhciA8LSBhcy5udW1lcmljKE5NQzJfeXIkeWVhcikKCgoKYTwtIGdncGxvdCgpICsgCiAgZ2VvbV9yZWN0KGRhdGE9ZCwgbWFwcGluZz1hZXMoeG1pbj14MSwgeG1heD14MiwgeW1pbj0wLCB5bWF4PTEsIGZpbGw9Q29uZmxpY3QpLGFscGhhPTAuMTUpICsKICBnZW9tX2xpbmUoZGF0YSA9IE5NQzJfeXIsIGFlcyh4ID0geWVhciwgeSA9IGlyc3QsIGNvbG9yID0gc3RhdGVhYmIsIGdyb3VwID0gc3RhdGVhYmIpKSsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikKCmEyPC0gZ2dwbG90KCkgKyAKICBnZW9tX3JlY3QoZGF0YT1kLCBtYXBwaW5nPWFlcyh4bWluPXgxLCB4bWF4PXgyLCB5bWluPTAsIHltYXg9MSwgZmlsbD1Db25mbGljdCksYWxwaGE9MC4xNSkgKwogIGdlb21fbGluZShkYXRhID0gTk1DX29yaWdfeXIsIGFlcyh4ID0geWVhciwgeSA9IGlyc3QsIGNvbG9yID0gc3RhdGVhYmIsIGdyb3VwID0gc3RhdGVhYmIpKSsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikKCmI8LWdncGxvdCgpICsgCiAgZ2VvbV9yZWN0KGRhdGE9ZCwgbWFwcGluZz1hZXMoeG1pbj14MSwgeG1heD14MiwgeW1pbj0wLCB5bWF4PTEsIGZpbGw9Q29uZmxpY3QpLGFscGhhPTAuMTUpICsKICBnZW9tX2xpbmUoZGF0YSA9IE5NQzJfeXIsIGFlcyh4ID0geWVhciwgeSA9IG1pbGV4LCBjb2xvciA9IHN0YXRlYWJiLCBncm91cCA9IHN0YXRlYWJiKSkrIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCgpiMjwtIGdncGxvdCgpICsgCiAgZ2VvbV9yZWN0KGRhdGE9ZCwgbWFwcGluZz1hZXMoeG1pbj14MSwgeG1heD14MiwgeW1pbj0wLCB5bWF4PTEsIGZpbGw9Q29uZmxpY3QpLGFscGhhPTAuMTUpICsKICBnZW9tX2xpbmUoZGF0YSA9IE5NQ19vcmlnX3lyLCBhZXMoeCA9IHllYXIsIHkgPSBpcnN0LCBjb2xvciA9IHN0YXRlYWJiLCBncm91cCA9IHN0YXRlYWJiKSkrIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCgoKYzwtZ2dwbG90KCkgKyAKICBnZW9tX3JlY3QoZGF0YT1kLCBtYXBwaW5nPWFlcyh4bWluPXgxLCB4bWF4PXgyLCB5bWluPTAsIHltYXg9MSwgZmlsbD1Db25mbGljdCksYWxwaGE9MC4xNSkgKwogIGdlb21fbGluZShkYXRhID0gTk1DMl95ciwgYWVzKHggPSB5ZWFyLCB5ID0gbWlscGVyLCBjb2xvciA9IHN0YXRlYWJiLCBncm91cCA9IHN0YXRlYWJiKSkrIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCgpjMjwtIGdncGxvdCgpICsgCiAgZ2VvbV9yZWN0KGRhdGE9ZCwgbWFwcGluZz1hZXMoeG1pbj14MSwgeG1heD14MiwgeW1pbj0wLCB5bWF4PTEsIGZpbGw9Q29uZmxpY3QpLGFscGhhPTAuMTUpICsKICBnZW9tX2xpbmUoZGF0YSA9IE5NQ19vcmlnX3lyLCBhZXMoeCA9IHllYXIsIHkgPSBpcnN0LCBjb2xvciA9IHN0YXRlYWJiLCBncm91cCA9IHN0YXRlYWJiKSkrIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCgpkMjwtIGdncGxvdCgpICsgCiAgZ2VvbV9yZWN0KGRhdGE9ZCwgbWFwcGluZz1hZXMoeG1pbj14MSwgeG1heD14MiwgeW1pbj0wLCB5bWF4PTEsIGZpbGw9Q29uZmxpY3QpLGFscGhhPTAuMTUpICsKICBnZW9tX2xpbmUoZGF0YSA9IE5NQ19vcmlnX3lyLCBhZXMoeCA9IHllYXIsIHkgPSBpcnN0LCBjb2xvciA9IHN0YXRlYWJiLCBncm91cCA9IHN0YXRlYWJiKSkrIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCgoKZDwtZ2dwbG90KCkgKyAKICBnZW9tX3JlY3QoZGF0YT1kLCBtYXBwaW5nPWFlcyh4bWluPXgxLCB4bWF4PXgyLCB5bWluPTAsIHltYXg9MSwgZmlsbD1Db25mbGljdCksYWxwaGE9MC4xNSkgKwogIGdlb21fbGluZShkYXRhID0gTk1DMl95ciwgYWVzKHggPSB5ZWFyLCB5ID0gdHBvcCwgY29sb3IgPSBzdGF0ZWFiYiwgZ3JvdXAgPSBzdGF0ZWFiYikpKyB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKQoKCgoKZ3JpZC5hcnJhbmdlKGEsYTIsIGIsIGIyLCBjLCBjMiwgZCAsbnJvdyA9IDQgKQoKCmBgYAoK